2016-09-19 3 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 после команды компиляции, как это answer, и предлагает документация для pkg-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

Смежные вопросы