最近做做項目的時候,在編譯代碼的時候遇到很多棘手的問題,網上的資料也比較少。關於上訴問題,我就是來說說看。
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自動幫我們重定位,我認為保險的方式是做好庫的順序。
那我這里稍微整理了下鏈接順序。
-
高層靜態鏈接庫
-
底層依賴庫
-
高層動態鏈接庫
-
其他無關系鏈接庫
….fuck,fuck! 重寫兩次了,第一次斷電能理解,第二次莫名其妙的關了次電腦,來吧,我們都是文明人,這只是個小插曲,我們繼續。。。