gcc 編譯順序問題

Makefile編譯生成一個動態庫,這個動態庫需要鏈接一個第三方靜態庫,結果在寫測試程序時,一直編譯出錯,「undefined referrence」.

最後發現,是gcc參數順序問題導致。

從網上查到相關資料

對於C/C++編譯而言,讀取編譯選項是按照從左到右的順序執行的(注1) 。那麼當編譯器遇到源文件的時候,就開始對源文件中用到的函數進行解析,找到相對應的函數的函數體或者說是實現(Definition of Function)。這個過程是按照先遇到不能解析的函數(unresolved function),然後在源文件選項後面的一些選項中尋找可能的函數體的信息,是這樣的一個順序進行的。那麼我們可以發現對於Makefile A,由於包含函數體或者函數定義信息的編譯選項出現在源文件之前,那麼當編譯器在源文件中遇到不能解析的函數時,在源文件之後的選項中尋找相關的信息,那麼就出現了編譯錯誤,也就是無法找到相關的函數定義。

錯誤用法:

$(CC) $(LIB_DIR) $(LINK_LIB) -shared -Wl, $(OBJS) -o $@

正確用法:

$(CC) -shared -Wl, $(OBJS) $(LIB_DIR) $(LINK_LIB) -o $@

书籍推荐