首页 > 代码库 > 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

这样就成功了。

linux下将.a文件链接到.so文件的问题