c - 使用介子构建 C 项目:处理 3rd 方本地库的正确方法
问题描述
我想构建一个使用Criterion测试库的项目,并且我正在使用介子来构建它。我能够构建自己的代码,一个仅依赖于标准 c 库的静态库。单元测试依赖于#include <criterion/criterion.h>
. 如果我尝试下载二进制存档并将其包含在 meson.build 文件中,我将无法成功构建项目。我相信我没有正确地配置介子。我是介子的新手,所以我不确定我错了什么。
介子.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/
末尾。
完整的 meson.build ,
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
正如乔纳森所建议的,为此固定的是,
如果要将 Criterion 库安装到这些位置之一,则可能需要指定 -R/opt/criterion-v2.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 的帮助和洞察力。
推荐阅读
- c++ - 无法生成 Mandelbrot 矩阵以将其保存到 C++ 线程中的文件
- c# - 我无法反序列化我的 json api 上的可变属性日期
- java - 需要从文件中获取一行到队列中,而不是整个文件文本
- rest - 套接字可以代替 HTTP 请求吗?(套接字与 http)
- javascript - 如何修复 npm run dev 给出的错误?
- flutter - Flutter 和 WordPress Api,不是从网站获取图片,而是从 assets.image 获取
- python - 在reportlab中的表数据变量内的值中添加新行
- pandas - 如何按 2 列分组和过滤?
- assembly - 如何解释 x86-64 xor 后跟 jle?
- python - 使用 BeautifulSoup4 获得结果的问题