用介子构建C项目:处理第三方本地库的正确方法
我想建立一个利用测试库的项目,我用介子来建立它。我能够构建自己的代码,一个只依赖于标准c库的静态库。单元测试依赖于用介子构建C项目:处理第三方本地库的正确方法,c,meson-build,C,Meson Build,我想建立一个利用测试库的项目,我用介子来建立它。我能够构建自己的代码,一个只依赖于标准c库的静态库。单元测试依赖于#include。如果我试图下载二进制文件并将其包含在meson.build文件中,我将无法成功构建该项目。我相信我没有正确地混淆介子。我是介子新手,所以我不确定是什么,我搞错了 介子构建 project('is_substring', 'c') static_library( 'is_substring', 'is_substring.h', ) executa
#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(库之间没有循环依赖关系)。共享库可以隐藏排序问题。可以使用编译器/链接器选项提供帮助。