編譯鏈接5大潛規則

轉自:http://blog.csdn.net/zdl1016/article/details/9015447


潛規則1:

當一個符號在多個目標文件(.o)裏同時出現時, LD報錯. 提示符號多重定義.

當一個符號在多個靜態庫(.a)裏同時出現時, LD不報錯, 以第一個遇到的爲準. 並且不會有任何warning提示 !!! 這個潛規則可能導致很多意想不到的問題!!!



潛規則2: LD對依賴庫的輸入順序敏感.
LD在鏈接生成目標文件時, 會從左到有掃描輸入的依賴庫, 但是, 當依賴庫之間也有依賴關係時,必須將依賴別人的庫放在 “被別人依賴的庫的前面. 否則,會鏈接失敗! 這點和vc++很不一樣哦.


潛規則3:頭文件搜索

gcc在尋找頭文件時, 會按照一定的順序在很多個目錄挨個尋找, 一旦找到一個即停止尋找. 如果項目中存在多個同名的頭文件, 則以第一個爲準, 後面的直接忽略. 這個特性會導致很多編譯不通過的問題!

GCC的尋找依賴的頭文件順序參看Bloghttp://blog.csdn.net/crylearner/article/details/17013187


潛規則 4 :

 ld 會把所有通過-l指定的動態庫全部鏈接進最終的目標程序中, 無論是否真的用到(導致生產環境加載失敗)。

所以不需要的庫就不要加入。

潛規則5:

假設我們知道undified symbol的符號確定存在xxx.a裏面.雖然使用了Makefile裏面加上了xxx.a的依賴, 但是, 一定要把xxx.a放在最後面. 因爲有可能so依賴的其他的.a庫也用到了xxx.a.否則極容易出現undifined symbol



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章