error adding symbols: DSO missing from command line

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

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

大概就是說,若是庫B依賴了庫A來靜態編譯,那麼庫B就會有庫A的連接信息,那咱們就來講說錯誤的狀況app

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

會輸出spa

/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的時候沒有問題,後面就有問題了。code

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

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

這樣就編譯正常了,程序也可以正常運行。blog

關於連接庫的順序問題,我看了下連接庫的順序問題一文,正常的狀況下,鏈動態接庫時是從左至右開始連接,若是出現了順序錯誤,gcc自動幫咱們重定位,我認爲保險的方式是作好庫的順序。遞歸

那我這裏稍微整理了下連接順序。get

  1. 高層靜態連接庫it

  2. 底層依賴庫

  3. 高層動態連接庫

  4. 其餘無關係連接庫





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

相關文章
相關標籤/搜索