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



我想构建一个利用Criterion测试库的项目,我正在使用介子来构建这一切。我能够构建自己的代码,一个只依赖于标准c库的静态库。单元测试依赖于#include <criterion/criterion.h>。如果我试图下载二进制档案并将其包含在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')
#]
)

项目结构为


▸ builddir/
▸ libs/criterion-v2.3.3/
is_substring.h
is_substring.test.c
meson.build

并且Criterion二进制档案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

is_substring.test.c

#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);
}

is_substring.h

#include "stdbool.h"
bool is_substring(const char *fullstr, const char *substr)
{
return true;
}

当我尝试构建时的错误是,

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$

正如@jonathan leffler在评论中指出的那样,这个gcc命令可以正确工作、编译和链接,

gcc -o is_substring.test is_substring.test.c -I libs/criterion-v2.3.3/include/ -Llibs/criterion-v2.3.3/lib -lcriterion

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

但使其编译的修复方法是添加一个

executable(
...
objects: [
'libs/criterion-v2.3.3/lib/libcriterion.so',
]

注意,include_directories路径也应该是'libs/criterion-v2.3.3/include/'include/在末尾。

完整的介子构建

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所建议的,修复了

如果要将criterion库安装到其中一个位置,则可能需要指定-R/opt/criterion-2.3.3/lib或-R/usr/local/lib。或者,这可能在Solaris中被记错了,在Linux上也不相关。无论如何,系统可能会在/usr/local/lib中查找。还有LD_LIBRARY_PATH;您可以将/home/you/project/libs/criterion-v2.3.3/lib(或大约(添加到LD_LIBRARY_PATH环境变量中,这应该允许它在正式安装之前被拾取

感谢@jonathan leffler的帮助和洞察力。

最新更新