将符号从静态对象复制到共享对象

not*_*esh 2 linker gcc

我有一个库,foo,我已经为它生成了一个静态对象(libfoo.a).

我有一个第二个库,bar,我为它生成了一个共享对象(libbar.so),它从libfoo.a中获取一些符号.

我有第三个图书馆,baz,我正试图链接到吧.在调用链接器时,我得到有关条形中缺少符号的错误(对应于foo中的符号).nm告诉我这些符号存在于libfoo.a中,但不存在于libbar.so中; 但是,libbar.so中的libfoo.a中有一些符号.

为什么不复制所有符号?

小智 5

.a库不是一个"静态对象".甲.a文件是归档时,在理论上类似tar,但不同的格式,并通过将所生成的ar命令.存档中的每个对象都是独特且个性化的.通常这些对象是.o文件,它们是已编译的未链接对象.其中一个.o文件中的所有符号将在链接(ld)期间包含在另一个文件中.但是,在链接期间不需要存档中的所有对象,其他对象文件中的符号将不会在链接文件中看到.

例如,在libdialog.a,有mouse.ocolumns.o目标文件.您的程序使用列,但不使用鼠标功能.因此,您的程序包含所有符号columns.o,但不包括任何符号mouse.o.

使用"共享对象"(.so),它是一个单个对象,因此链接它将包括对象中的所有符号,是否需要.在上面的示例中,如果我们链接libdialog.so,则程序将包括来自两者的符号columns.o,mouse.o即使未使用基于鼠标的代码.

生成共享对象(.so)时,使用archive(.a)时会应用相同的链接规则.因此,该.so文件将仅包含.o存档中使用的文件中的符号.