Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用介子构建C项目:处理第三方本地库的正确方法_C_Meson Build - Fatal编程技术网

用介子构建C项目:处理第三方本地库的正确方法

用介子构建C项目:处理第三方本地库的正确方法,c,meson-build,C,Meson Build,我想建立一个利用测试库的项目,我用介子来建立它。我能够构建自己的代码,一个只依赖于标准c库的静态库。单元测试依赖于#include。如果我试图下载二进制文件并将其包含在meson.build文件中,我将无法成功构建该项目。我相信我没有正确地混淆介子。我是介子新手,所以我不确定是什么,我搞错了 介子构建 project('is_substring', 'c') static_library( 'is_substring', 'is_substring.h', ) executa

我想建立一个利用测试库的项目,我用介子来建立它。我能够构建自己的代码,一个只依赖于标准c库的静态库。单元测试依赖于
#include
。如果我试图下载二进制文件并将其包含在meson.build文件中,我将无法成功构建该项目。我相信我没有正确地混淆介子。我是介子新手,所以我不确定是什么,我搞错了

介子构建

project('is_substring', 'c')

static_library(
    'is_substring',
    'is_substring.h',
)

executable(
    'test_is_substring',
    'is_substring.test.c',
    include_directories: include_directories(
        'libs/criterion-v2.3.3',
    ),
    #dependencies: [
    #    dependency('criterion')
    #]
)
#include "criterion/criterion.h"
#include <stdbool.h>
#include <stdio.h>

#include "is_substring.h"


Test(is_substring, is_substring)
{
    cr_assert(is_substring("aaa", "a") == true);
}
#include "stdbool.h"

bool is_substring(const char *fullstr, const char *substr)
{
    return true;
}
project('is_substring', 'c')

static_library(
    'is_substring',
    'is_substring.h',
)

include_criterion = include_directories(
    'libs/criterion-v2.3.3/include/',
)

executable(
    'test_is_substring',
    'is_substring.test.c',
    include_directories: [
        include_criterion,
    ],
    objects: [
        'libs/criterion-v2.3.3/lib/libcriterion.so',
    ]
)
项目结构为:


  ▸ builddir/
  ▸ libs/criterion-v2.3.3/
    is_substring.h
    is_substring.test.c
    meson.build
标准二进制存档tar.bz2已提取到
/libs

  ▾ libs/criterion-v2.3.3/
    ▾ include/criterion/
      ▸ internal/
        abort.h
        alloc.h
        assert.h
        criterion.h
        event.h
        hooks.h
        logging.h
        options.h
        output.h
        parameterized.h
        redirect.h
        stats.h
        theories.h
        types.h
    ▾ lib/
        libcriterion.so
        libcriterion.so.3
        libcriterion.so.3.1.0
    ▾ share/pkgconfig/
        criterion.pc
是子字符串test.c

project('is_substring', 'c')

static_library(
    'is_substring',
    'is_substring.h',
)

executable(
    'test_is_substring',
    'is_substring.test.c',
    include_directories: include_directories(
        'libs/criterion-v2.3.3',
    ),
    #dependencies: [
    #    dependency('criterion')
    #]
)
#include "criterion/criterion.h"
#include <stdbool.h>
#include <stdio.h>

#include "is_substring.h"


Test(is_substring, is_substring)
{
    cr_assert(is_substring("aaa", "a") == true);
}
#include "stdbool.h"

bool is_substring(const char *fullstr, const char *substr)
{
    return true;
}
project('is_substring', 'c')

static_library(
    'is_substring',
    'is_substring.h',
)

include_criterion = include_directories(
    'libs/criterion-v2.3.3/include/',
)

executable(
    'test_is_substring',
    'is_substring.test.c',
    include_directories: [
        include_criterion,
    ],
    objects: [
        'libs/criterion-v2.3.3/lib/libcriterion.so',
    ]
)
我尝试构建时的错误是

francium@4ab5198f934f:/mnt/c/brute-force/builddir$ ninja
[1/2] Compiling C object 'test_is_substring@exe/is_substring.test.c.o'.
FAILED: test_is_substring@exe/is_substring.test.c.o
cc -Itest_is_substring@exe -I. -I.. -I../libs/criterion-v2.3.3 -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -g -MD -MQ 'test_is_substring@exe/is_substring.test.c.o' -MF 'test_is_substring@exe/is_substring.test.c.o.d' -o 'test_is_substring@exe/is_substring.test.c.o' -c ../is_substring.test.c
../is_substring.test.c:1:10: fatal error: criterion/criterion.h: No such file or directory
 #include <criterion/criterion.h>
          ^~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
ninja: build stopped: subcommand failed.
francium@4ab5198f934f:/mnt/c/brute-force/builddir$

设法将其编译,但由于Criteria库是一个共享库,并且它不是全局安装的,因此如果您只是尝试运行已编译的测试可执行文件,它将不起作用

但要使其编译,需要添加一个

executable(
    ...
    objects: [
        'libs/criterion-v2.3.3/lib/libcriterion.so',
    ]
请注意,
include\u目录
路径也应该是
'libs/criteria-v2.3.3/include/'
,最后是
include/

介子构建

project('is_substring', 'c')

static_library(
    'is_substring',
    'is_substring.h',
)

executable(
    'test_is_substring',
    'is_substring.test.c',
    include_directories: include_directories(
        'libs/criterion-v2.3.3',
    ),
    #dependencies: [
    #    dependency('criterion')
    #]
)
#include "criterion/criterion.h"
#include <stdbool.h>
#include <stdio.h>

#include "is_substring.h"


Test(is_substring, is_substring)
{
    cr_assert(is_substring("aaa", "a") == true);
}
#include "stdbool.h"

bool is_substring(const char *fullstr, const char *substr)
{
    return true;
}
project('is_substring', 'c')

static_library(
    'is_substring',
    'is_substring.h',
)

include_criterion = include_directories(
    'libs/criterion-v2.3.3/include/',
)

executable(
    'test_is_substring',
    'is_substring.test.c',
    include_directories: [
        include_criterion,
    ],
    objects: [
        'libs/criterion-v2.3.3/lib/libcriterion.so',
    ]
)
但是运行输出可执行文件在运行时会出现以下错误:

./test_is_substring: error while loading shared libraries: libcriterion.so.3: cannot open shared object file: No such file or directory
正如Jonathan所建议的,固定的

如果要将标准库安装到其中一个位置,可能需要指定-R/opt/criteria-v2.3.3/lib或-R/usr/local/lib。或者,Solaris可能会错误地记住这一点,并且与Linux无关。无论如何,系统可能会在/usr/local/lib中查找。还有LD_LIBRARY_PATH;您可以将/home/you/project/libs/criteria-v2.3.3/lib(或其左右)添加到LD_LIBRARY_PATH环境变量中,这样就可以在正式安装之前提取它


感谢@jonathan leffler的帮助和见解。

如果您将
包含目录:包含目录('libs/criteria-v2.3.3',),
更改为
包含目录:包含目录('libs/criteria-v2.3.3/include',),
?其思想是,include目录在
libs/criteria-v2.3.3
@JonathanLeffler Yes下命名,然后它设法编译,但在链接过程中它无法找到
.so
文件。我不知道如何告诉介子在哪里寻找可链接的库文件。我想,如果我只把它指向整个目录,而不仅仅是
include/
,它会按照惯例计算出来。根据我看到的,你应该使用
gcc…-Llib/criteria-v2.3.3/lib-lcriterion…
。库参数应出现在最后一个对象文件之后。如果您自己的库调用了Criteria库,那么它应该位于命令行上Criteria库的前面。如果它们是独立的,则顺序不应该是关键的。名义上,您建议的带有
-lcriterion./libs/../libcriterian的命令行。因此
链接同一个库两次。在排序时:
-L
选项需要继续执行取决于该位置的
-L
选项。通常最明智的做法是在任何库之前列出所有对象(或源)文件。有时有理由采取不同的做法,但并不经常如此。然后可以使用静态库或共享库。有时事情的顺序不同;有时他们不会。如果要成功使用静态库,您确实需要在库中有一个DAG(库之间没有循环依赖关系)。共享库可以隐藏排序问题。可以使用编译器/链接器选项提供帮助。