最近項目正經歷着一次更新,一系列編譯工具都進行了大版本的升級,隨時而來的是,本來正常編譯的代碼出現了大量的warning,最終編譯失敗,其中一個問題困擾了比較長的時間,雖然fix的方法不難,可是一直不清楚根本緣由,經過大量的google,終於找到的緣由,特意記錄一下。ubuntu
先把主要的參考文章寫一下:
Understanding DSO link change
Tool Chain Transition函數
主要是下面這行錯誤:工具
error adding symbols: DSO missing from command line
場景是:google
那麼問題來了,若是bin_c中調用了函數foo(),那麼編譯能不能經過?
在binutils<2.22時,ld正常完成了,bin_c對於foo的調用經由libB,傳遞到了libA,連接成功。
可是當binutils>=2.22時,編譯出錯了,ld會報上面的錯,告訴你foo這個symbol解析不到,這時,咱們須要編譯bin_c時,顯示地連接libA才能夠經過。
binutils2.22開始,其中的ld開始把--no-copy-dt-needed-entries默認打開,這樣一來,ld不會再自動遞歸地解析連接的lib,而須要由用戶來一一指定。code
PS:檢查binutils的版本,方法很簡單:遞歸
ld -v
這樣作的好處在於當libA有變化,甚至foo接口發生變化時,編譯時就能報錯。接口
另外,還以一個ld的選項--allow-shlib-undefined,做用是容許在動態庫中存在未解析到的函數symbol,至於理由能夠自行查看man ld,由於有些項目就是在運行時才能決定使用的動態庫, ld的manual中也舉了一個相應的例子。get
時間倉促,沒有貼代碼上來,並且必定還有沒有深刻到的地方,往後再來完善,若是有不對的地方,歡迎指正!it