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 $@