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
這樣就成功了。