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

這樣就成功了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章