2014-09-25 124 views
1

我從源碼安裝了一個新的lib,我試圖鏈接到它。鏈接器抱怨說它找不到應該在lib中的符號。如何鏈接到共享庫?

這裏有錯誤,我得到:

$ make all 
gcc -std=c99 -g -Wall -O3 `pkg-config --cflags --libs libmodbus` -c client.c -o client.o 
gcc -std=c99 -g -Wall -O3 `pkg-config --cflags --libs libmodbus` client.o -o client 
client.o: In function `main': 
/home/gauthier/code/modbus/client.c:29: undefined reference to `modbus_new_tcp' 
/home/gauthier/code/modbus/client.c:30: undefined reference to `modbus_connect' 
/home/gauthier/code/modbus/client.c:33: undefined reference to `modbus_read_registers' 
/home/gauthier/code/modbus/client.c:35: undefined reference to `modbus_close' 
/home/gauthier/code/modbus/client.c:36: undefined reference to `modbus_free' 
collect2: error: ld returned 1 exit status 
make: *** [client] Error 1 

pkg-config這樣說:

$ pkg-config --cflags --libs libmodbus 
-I/usr/local/include/modbus -L/usr/local/lib -lmodbus 

/usr/local/lib文件是這些:

$ ls /usr/local/lib/ | grep mod 
libmodbus.la 
libmodbus.so 
libmodbus.so.5 
libmodbus.so.5.0.5 

而且,所以文件中包含未定義的參考文獻:

$ grep modbus_connect /usr/local/lib/* 
Binary file /usr/local/lib/libmodbus.so matches 
Binary file /usr/local/lib/libmodbus.so.5 matches 
Binary file /usr/local/lib/libmodbus.so.5.0.5 matches 

我試過加/usr/local/libLD_LIBRARY_PATH,沒有了。不是說我可以幫忙,因爲我的編譯器命令中有-L

我也嘗試手動編寫-I,-L-l(不使用pkg-config),這並沒有幫助。

如何使鏈接器明白對modbus_*函數的引用是否正確?

+0

GCC -v XXX看到詳細 – farmer1992 2014-09-25 14:59:32

+0

把-lmodbus到底 – farmer1992 2014-09-25 15:00:52

回答

5

讓我猜。

它在你寫這個選項的命令中有所不同, 鏈接器按指定的順序搜索並處理庫和目標文件,其順序爲 。因此,'foo.o -lz bar.o'在 文件foo.o之後但在bar.o之前搜索庫'z'。如果bar.o指'z'中的函數, 這些函數可能不會被加載

http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html

所以儘量把pkg-config --cflags --libs libmodbus

+0

最糟糕的是,我其實已經讀這一點,但它曲解。我儘管鏈接器從左向右讀,並且需要在讀取利用它的目標文件之前閱讀lib。恰恰相反,鏈接器似乎需要知道什麼符號丟失,然後從lib中取出它們。 – Gauthier 2014-09-26 06:58:28