1. 程式人生 > >linux下將.a檔案連結到.so檔案的問題

linux下將.a檔案連結到.so檔案的問題

比如在連結lib123.a庫生成libabc.so庫時經常會遇到這個問題,當連結libabc.so時出現以下錯誤:

libabc.so: undefined reference to `XXX’

在readelf -s lib123.a | grep “XXX”時,顯示

165: 0000000000000c70   275 FUNC    GLOBAL DEFAULT    1 XXX

而readelf -s libabc.so | grep “XXX”時卻

2: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND XXX

表明在lib123.a有該符號,而在libabc.so中卻未定義該符號,說明在連結lib123.a庫生成libabc.so庫時符號未導過來。

這可以通過以下方法解決:

在生成libabc.so時新增選項-Wl,–whole-archive

gcc -shared -Wl,–whole-archive lib123.a -Wl,–no-whole-archive -o libabc.so

–whole-archive和–no-whole-archive是ld的選項,gcc通過-Wl傳給ld,–whole-archive表明在此之後的靜態庫中的符號都匯出,–no-whole-archive表明在此之後關閉此選項,這樣就將lib123.a中的符號真正匯出給libabc.so了

這次再readelf -s libabc.so | grep “XXX”

2959: 00000000004a5130   275 FUNC    GLOBAL DEFAULT   11 XXX

這樣就成功了。