項目中需要鍊入2個第三方的庫,結果遇到了一個比較有意思的問題,這裡記錄一下分析和解決過程。
兩個第三方的庫,一個是動态庫,暫且稱之為libone.so;另一個是靜态庫,暫且稱之為libtwo.a。而libone.so中調用了libtwo.a中的一個函數func(void),我剛開始的編譯指令這樣寫的:
gcc main.c -L. -l:libtwo.a lone -o output
結果編譯報錯,提示func()函數未定義。可是func()函數明明在libtwo.a中定義了,且libtwo.a也鍊進去了,為什麼會報這樣的錯誤呢?帶着疑問上網搜了搜,找到了答案。原來gcc是按從右到左的順序查找依賴庫的,是以被依賴的庫要放到引用庫的右側。是以,編譯指令改成這樣:
gcc main.c -L. lone -l:libtwo.a -o output
結果仍然報錯,報錯資訊為libtwo.a這個庫中undefined reference to symbol '_Znam@@GLIBCXX_3.4',查找了一番資料,推測應該是這個庫裡面引用了c++的庫。于是,試着把編譯器改成g++,結果能順利編過。但是,我并不想使用g++編譯器。那麼,怎樣可以使用gcc編譯器,但是還能連結c++的庫呢?萬能的網友給了答案,那就是加上-lstdc++選項。編譯指令如下:
gcc main.c -L. lone -lstdc++ -l:libtwo.a -o output
編譯通過!最後,提醒一下,上述編譯指令隻是一個示例,并不是完整的指令,僅供參考。