linux下將.a檔案連結到.so檔案的問題
阿新 • • 發佈:2019-01-30
比如在連結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
這樣就成功了。