我正在尝试使用libcheck构建一个简单的示例,但在使用 pkg-config 报告的标志时无法构建。
我的文件:tests/test.c
#include <stdlib.h>
#include <check.h>
START_TEST(zero)
{
int z = 0;
ck_assert_int_eq(0, z);
}
END_TEST
Suite* suite_zero(void)
{
Suite* s;
TCase* tc;
s = suite_create("suite_zero");
tc = tcase_create("zero");
tcase_add_test(tc, zero);
suite_add_tcase(s, tc);
return s;
}
int main(void)
{
int number_failed;
SRunner* sr;
Suite* s_zero = suite_zero();
sr = srunner_create(s_zero);
srunner_run_all(sr, CK_NORMAL);
number_failed = srunner_ntests_failed(sr);
srunner_free(sr);
return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
}
Run Code Online (Sandbox Code Playgroud)
我的系统:
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04 LTS"
$ gcc --version
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.2) 5.4.0 20160609
$ pkg-config --version
0.29.1
Run Code Online (Sandbox Code Playgroud)
当我尝试使用 pkg-config 报告的标志和库构建我的测试时:
$ pkg-config --cflags --libs check
-pthread -lcheck_pic -pthread -lrt -lm -lsubunit
$ gcc -pthread -lcheck_pic -pthread -lrt -lm -lsubunit -g tests/test.c -o tests/zero
/tmp/ccRV2kLw.o: In function `zero':
Code/tests/test.c:4: undefined reference to `tcase_fn_start'
/Code/tests/test.c:7: undefined reference to `_mark_point'
/Code/tests/test.c:7: undefined reference to `_ck_assert_failed'
/tmp/ccRV2kLw.o: In function `suite_zero':
/Code/tests/test.c:15: undefined reference to `suite_create'
/Code/tests/test.c:16: undefined reference to `tcase_create'
/Code/tests/test.c:17: undefined reference to `_tcase_add_test'
/Code/tests/test.c:19: undefined reference to `suite_add_tcase'
/tmp/ccRV2kLw.o: In function `main':
/Code/tests/test.c:30: undefined reference to `srunner_create'
/Code/tests/test.c:32: undefined reference to `srunner_run_all'
/Code/tests/test.c:33: undefined reference to `srunner_ntests_failed'
/Code/tests/test.c:34: undefined reference to `srunner_free'
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
Libcheck 由 apt 安装,库和头文件分别位于典型位置 /usr/lib 和 /usr/include。不过好像找不到了。我有点不明白为什么。有任何想法吗?
谢谢。
小智 5
尝试在编译命令之后添加 pkg-config 报告的标志作为这个答案和pkg-config建议的文档。编译器需要事先知道它试图将库链接到哪个文件,以便可以适当地应用标志。
gcc -g test.c -o test -pthread -lcheck_pic -pthread -lrt -lm -lsubunit
Run Code Online (Sandbox Code Playgroud)
或更简洁地
gcc -g test.c -o test `pkg-config --cflags --libs check`
Run Code Online (Sandbox Code Playgroud)