1. 程式人生 > >linux 編譯 依賴靜態庫的靜態庫問題

linux 編譯 依賴靜態庫的靜態庫問題

前言----------------------------------

最近工作中遇到一個linux編譯問題,其實是小問題,但經驗不足,弄了2天,特做記錄。

背景---------------------------------

這次是做一個新的專案,專案軟體編譯架構如下圖:

|-----libm1.a          |-----libn1.a

main-----|-----libm2.a -------|

|-----libm3.a          |------libn2.a

說明:主程式下有三個模組m1、m2、m3,其中模組m2依賴開源模組n1和n2,模組n1依賴n2.

編譯時是在主makefile裡包含所有的子makefile,包括m1、m2、m3、n1和n2的makefile,連結時把所有的靜態庫連結成一個可執行程式。

問題--------------------------------------

編譯到最後所有的靜態庫都生產了,但是在連結時,報錯連結libm2.a的時候報錯,類似“func_xxx() 未定義的引用”。

這些func_xxx()都是定義在libn1.a和libn2.a裡的函式,並且在libm2.a裡面被呼叫了。

原因應該是連結libm2時找不到這些函式的實現。

解決方法---------------------------------

調整連結的順序即可,之前的連結順序是:

LIBS += $(REL_LIB_DIR)/libn1.a
LIBS += $(REL_LIB_DIR)/libn2.a
LIBS += $(REL_LIB_DIR)/libm2.a

調整後為:

LIBS += $(REL_LIB_DIR)/libm2.a
LIBS += $(REL_LIB_DIR)/libn1.a
LIBS += $(REL_LIB_DIR)/libn2.a

總結----------------------------------------------

這個問題是連結時找不到依賴函式的實現,原因是連結時依賴順序不對。

之前做的比較多的是android的makefile,android裡面的連結順序寫法是把被依賴的庫寫在前面,而linux裡面剛剛相反了。