2011-06-06 29 views
7

GCC可以得到相當挑剔的,它接受它的參數的順序:GCC命令行參數Pickiness

# Works. 
g++ Foo.cpp -L. -I. -lBar -o Foo 

# Linker errors. 
g++ -o Foo -I. -L. -lBar Foo.cpp 

什麼,具體而言,是命令行選項的排序要求?

回答

7

圖書館根據需要從它們中加載符號,所以提供其他東西所需要的符號的圖書館必須遵循那個東西。這是歷史的;可以說現代系統應該自動解析符號,明智地處理循環(這是規則的原因;通過按需要次數指定庫來手動打破依賴性循環),但g++遵循傳統規則,因此它將與供應商ld s。 (GNU ld不能在任何地方工作,所以不可能依靠它來解決符號依賴性循環。甚至在GNU ld確實工作的平臺上也存在引導問題。)類似地,其他面向連接器的選項必須是以相對於它們影響的事物的正確順序指定(例如,-L選項必須位於指定目錄中的庫之前;如果一個目錄中的庫映射到標準目錄中的相同名稱的庫,這可能很重要)。

+0

引導關注?像什麼? – Maxpm 2011-06-06 05:14:08

+1

如果'gcc' /'g ++'依賴於特定於GNU'ld'的行爲,那麼您需要以什麼樣的順序構建GNU工具鏈才能運行。 ''gcc' /'g ++'爲了引導目的而用標準的供應商工具進行了很大的努力,因爲許多GNU程序都依賴於'gcc'擴展,並且根據GNU''ld''的具體行爲會破壞這個。 – geekosaur 2011-06-06 05:19:40