最近作作項目的時候,在編譯代碼的時候遇到不少棘手的問題,網上的資料也比較少。關於上訴問題,我就是來講說看。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
-
高層靜態連接庫it
-
底層依賴庫
-
高層動態連接庫
-
其餘無關係連接庫
….fuck,fuck! 重寫兩次了,第一次斷電能理解,第二次莫名其妙的關了次電腦,來吧,咱們都是文明人,這只是個小插曲,咱們繼續。。。