2011-10-08 97 views
1

我想在我的C程序中使用名爲iniparser的外部庫。我使用的是gcc 4.4。鏈接器錯誤:未定義對共享對象的引用

我將iniparser庫放在一個名爲lib/的子目錄中,頭文件位於lib/iniparser/src中,並且庫編譯爲lib/iniparser/libiniparser.so.0

我寫了一個短的Makefile編譯它,這裏的make輸出:

gcc -Wall -Wextra -Werror -c -I include/ src/smag_main.c -L lib/iniparser -liniparser -I lib/iniparser/src 
gcc -Wall -Wextra -Werror -c -I include/ -L lib/iniparser -liniparser -I lib/iniparser/src src/agros.c 
gcc -Wall -Wextra -Werror -c -I include/ -L lib/iniparser -liniparser -I lib/iniparser/src src/main.c 
gcc -Wall -Wextra -Werror -L lib/iniparser -liniparser -o agros smag_main.o main.o agros.o 
smag_main.o: In function `sec_haskey': 
smag_main.c:(.text+0xa9): undefined reference to `iniparser_find_entry' 
smag_main.o: In function `parse_config': 
smag_main.c:(.text+0x153): undefined reference to `iniparser_load' 
smag_main.c:(.text+0x18b): undefined reference to `iniparser_getint' 
smag_main.c:(.text+0x1c6): undefined reference to `iniparser_getstring' 
smag_main.c:(.text+0x202): undefined reference to `iniparser_getstring' 
smag_main.c:(.text+0x261): undefined reference to `iniparser_getstring' 
smag_main.c:(.text+0x2c2): undefined reference to `iniparser_getint' 
smag_main.c:(.text+0x2d5): undefined reference to `iniparser_freedict' 
collect2: ld returned 1 exit status 
make: *** [agros] Error 1 

海灣合作委員會第一次調用編譯smag_main.o成功,第二個編譯agros.o,第三個main.o。第4次調用是鏈接器,它將所有這些對象鏈接到可執行文件agros。它顯然失敗了。

它看起來像在連接時定位iniparser.so時出現問題。我的電話怎麼了?
我很困惑。

(替代的問題,如果任何人都可以通過直接調用ld來解釋如何鏈接它將是很好的)。

回答

4

嘗試把一個符號從libiniparser.so.0libiniparser.so

cd lib/iniparser/ 
ln -s libiniparser.so.0 libiniparser.so 
+0

它的工作,謝謝。這是標準行爲嗎?這是爲什麼? – rahmu

+0

當您提供命令-liniparser時,鏈接器正在查找具有特定名稱的庫。基本上libiniparser.a(用於靜態庫)或libiniparser.so(用於共享庫)。有理由有一個名爲libiniparser.so.0的文件有關更多詳細信息,請參閱此處:http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html – codehippo

相關問題