2016-10-03 97 views
0

我有一個使用math.h中的日誌函數的庫。當我編譯和打包這個庫時,我沒有收到編譯錯誤,這是正常的(我認爲)。將靜態庫與C數學庫正確鏈接

現在,當我嘗試使用庫的應用程序,GCC給我鏈接錯誤:

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 

這究竟是爲什麼?唯一可行的解​​決方案是我編譯使用該庫的程序時(即使程序本身不使用math.h),我必須向gcc提供-lm選項,但我覺得這樣做很麻煩。

我也嘗試在編譯庫時提供-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