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
这样就成功了。