發佈時間:2015-12-23 15:54:05來源:linux網站做者:烏合之衆html
在使用gcc編譯的時候有時候會碰到這樣的問題,編譯爲.o(obj) 文件沒有問題,可是編譯(這一步應該是連接)爲可執行文件的時候會出現找不到’xxx’的定義的狀況。linux
例如:socket
g++ -o spider -rdynamic -lpthread -levent -lcrypt -ldl bloomfilter.o confparser.o crc32.o dso.o hashs.o md5.o qstring.o sha1.o socket.o spider.o threads.o url.o
...ide
dso.o:在函數‘dso_load(char const*, char const*)’中:
dso.cpp:(.text+0x3c):對‘dlopen’未定義的引用
dso.cpp:(.text+0x4c):對‘dlsym’未定義的引用
dso.cpp:(.text+0xb5):對‘dlerror’未定義的引用
dso.cpp:(.text+0x13e):對‘dlclose’未定義的引用函數
緣由網站
出現這種狀況的緣由,主要是C/C++編譯爲obj文件的時候並不須要函數的具體實現,只要有函數的原型便可。可是在連接爲可執行文件的時候就必需要具體的實現了。若是錯誤是未聲明的引用,那就是找不到函數的原型,解決辦法這裏就不細緻說了,一般是相關的頭文件未包含。url
解決辦法spa
指定緣由就好辦了,既然知道是缺乏了函數的具體實現,那麼就給它這個函數的實現就行了。好比上面的例子,是由於確實了dlopen、dlsym、dlerror、dlclose這些函數的實現,這幾個函數是用於加載動態連接庫的,編譯的時候須要添加-ldl來使用dl庫(這是靜態庫,在系統目錄下/usr/lib/i386-linux-gnu/libdl.a、/usr/lib/x86_64-linux-gnu/libdl.a)。htm
可是看上面編譯的時候是有添加-ldl選項的,那麼爲何不行呢?md5
gcc 依賴順序問題
這個主要的緣由是gcc編譯的時候,各個文件依賴順序的問題。
在gcc編譯的時候,若是文件a依賴於文件b,那麼編譯的時候必須把a放前面,b放後面。
例如:在main.c中使用了pthread庫相關函數,那麼編譯的時候必須是main.c在前,-lpthread在後。gcc main.c -lpthread -o a.out。
上面出現問題的緣由就是引入庫的順序在前面了,將其放置在後面便可了。
g++ -o spider bloomfilter.o confparser.o crc32.o dso.o hashs.o md5.o qstring.o sha1.o socket.o spider.o threads.o url.o -rdynamic -lpthread -levent -lcrypt -ldl
Linux添加環境變量與GCC編譯器添加INCLUDE與LIB環境變量:http://www.linuxdiyf.com/linux/16492.html
GCC編譯器下的-L與-l的區別:http://www.linuxdiyf.com/linux/16182.html
Linux下GCC編譯器用於編譯運行的內核版本:http://www.linuxdiyf.com/linux/15874.html
Linux源碼安裝GCC編譯器:http://www.linuxdiyf.com/linux/7348.html