2016-09-19 255 views
1

我在嘗試使用libcheck構建一個簡單示例,但使用pkg-config報告的標誌時無法構建。libcheck測試無法鏈接

我的文件:測試/ 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; 
} 

我的系統:

$ 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 

當我嘗試使用pkg配置報告的標誌和庫來構建我的測試:

$ 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 

Libcheck由apt安裝,庫和頭文件分別位於典型位置/ usr/lib和/ usr/include中。但似乎找不到它。爲什麼我有點難過。有任何想法嗎?

感謝。

+0

庫放在最後 - 特別是你的源文件使可執行目標文件(或源文件)之後。 –

回答

1

嘗試在編譯命令之後添加由pkg-config報告的標記,因爲此answerpkg-config的文檔建議。編譯器需要知道它試圖將庫鏈接到事先哪些文件,以便可以適當地應用標誌。

gcc -g test.c -o test -pthread -lcheck_pic -pthread -lrt -lm -lsubunit 

或更簡潔

gcc -g test.c -o test `pkg-config --cflags --libs check` 
+1

我從來不知道訂單的重要性。我曾假設gcc會將其全部讀入並能夠弄清楚該怎麼做。謝謝。 – dangeroushobo