2016-10-03 13 views
0

У меня есть библиотека, которая использует функцию журнала из math.h. Когда я компилирую и упаковываю эту библиотеку, я не получаю ошибок компиляции, что нормально (я думаю).Правильно Связать статическую библиотеку с библиотекой C math

Теперь, когда я пытаюсь использовать библиотеку в приложении, НКУ дает мне ошибки компоновщика:

Compiling mytestlist using "mytestlist.o": 
gcc mytestlist.o -I/student/cmpt332/pthreads -I. -std=c99 -Wall -pedantic -L. -L/student/cmpt332/pthreads/lib/linuxx86_64/ -llist -o mytestlist 
./liblist.a(list_adders.o): In function `NodeCreate': 
list_adders.c:(.text+0x343): undefined reference to `log' 
./liblist.a(list_adders.o): In function `ListCreate': 
list_adders.c:(.text+0x62f): undefined reference to `log' 
./liblist.a(list_adders.o): In function `ListFree': 
list_adders.c:(.text+0xdcc): undefined reference to `log' 
list_adders.c:(.text+0xe55): undefined reference to `log' 
list_adders.c:(.text+0xefb): undefined reference to `log' 
./liblist.a(list_adders.o):list_adders.c:(.text+0xf96): more undefined references to `log' follow 
collect2: error: ld returned 1 exit status 
Makefile:47: recipe for target 'mytestlist' failed 
make: *** [mytestlist] Error 1 

Почему это происходит? Единственное решение, которое работает, заключается в том, что я должен предоставить параметр -lm gcc, когда я скомпилирую программу, использующую библиотеку (хотя сама программа не использует math.h), однако я считаю, что это громоздко.

Я также попытался предоставить опцию -lm при компиляции библиотеки, но когда приложение скомпилировано с использованием библиотеки, я получаю те же ошибки компоновщика.

Есть ли способ скомпилировать библиотеку с math.h без необходимости поставлять -lm в другие программы, которые используют библиотеку?

В случае, если вам интересно, я компилировать каждый объект, который составляет библиотеку с помощью:

gcc -std=c99 -Wall -pedantic -static -I. -c list_adders.c -o list_something.o -lm 

И библиотека упакована с помощью:

ar cvfr liblist.a list_something.o ... 
+3

Статическая библиотека не связана. Невозможно связать это с математической библиотекой, потому что нет никакого способа связать ее вообще. Вы связываете приложение или общую библиотеку, но не статическую библиотеку. Также нет способа отметить или записать зависимости вашей статической библиотеки в самой библиотеке. –

ответ

4

В вашей команде gcc -c, то -lm ничего не делает. Это вариант компоновщика, а -c означает «не ссылаться».

Правильное место для размещения -lm действительно после -llist всякий раз, когда вы его используете. Вот как выполняются зависимости статической библиотеки. Поместите его в документацию для liblist.

Если вы хотите что-то более любезное, есть pkg-config. С соответствующими конфигурационными файлами pkg-config --static --libs liblist выведет -llist -lm.