error adding symbols: DSO missing from command line


最近做做項目的時候,在編譯代碼的時候遇到很多棘手的問題,網上的資料也比較少。關於上訴問題,我就是來說說看。

DSO missing from command line原因及解決辦法,我也是看了這篇文章的介紹,才對這個錯誤有寫認識。

大概就是說,如果庫B依賴了庫A來靜態編譯,那么庫B就會有庫A的鏈接信息,那我們就來說說錯誤的情況

$ g++ main.cpp -lA -lB -o main  

會輸出

/usr/bin/ld: /usr/local/lib/libB.a(main.cpp.o): undefined reference to symbol '_a_symbol_name'
/usr/local/lib/libA.so: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status

當時上文博主說過,在binutils<2.22的時候沒有問題,后面就有問題了。

那這個應該是編譯問題,ld自動遞歸地解析鏈接的lib,當加載A庫的時候,一切還正常,但是加載B庫的時候,ld會自動的去解析他的靜態鏈接,所以就重復了,導致error adding symbols。所以下面這個就沒有問題了。

$ g++ main.cpp -lB -lA -o main  

這樣就編譯正常了,程序也能夠正常運行。

關於鏈接庫的順序問題,我看了下鏈接庫的順序問題一文,正常的情況下,鏈動態接庫時是從左至右開始鏈接,如果出現了順序錯誤,gcc自動幫我們重定位,我認為保險的方式是做好庫的順序。

那我這里稍微整理了下鏈接順序。

  1. 高層靜態鏈接庫

  2. 底層依賴庫

  3. 高層動態鏈接庫

  4. 其他無關系鏈接庫





….fuck,fuck! 重寫兩次了,第一次斷電能理解,第二次莫名其妙的關了次電腦,來吧,我們都是文明人,這只是個小插曲,我們繼續。。。




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM