初入職常見問題:gcc編譯時對’xxxx’未定義的引用

https://www.cnblogs.com/oloroso/p/4688426.html 如果此鏈接未失效,不用看下面的了

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
...

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文件的時候並不需要函數的具體實現,只要有函數的原型即可。但是在鏈接爲可執行文件的時候就必須要具體的實現了。如果錯誤是未聲明的引用,那就是找不到函數的原型,解決辦法這裏就不細緻說了,通常是相關的頭文件未包含。

解決辦法

指定原因就好辦了,既然知道是缺少了函數的具體實現,那麼就給它這個函數的實現就好了。比如上面的例子,是因爲缺失了dlopendlsymdlerrordlclose這些函數的實現,這幾個函數是用於加載動態鏈接庫的,編譯的時候需要添加-ldl來使用dl庫(這是靜態庫,在系統目錄下/usr/lib/i386-linux-gnu/libdl.a/usr/lib/x86_64-linux-gnu/libdl.a)。

但是看上面編譯的時候是有添加-ldl選項的,那麼爲什麼不行呢?

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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章