我有一个库foo,我为它生成了一个静态对象(libfoo.a)。
我有第二个库,bar,我为它生成了一个共享对象(libbar.so),它从libfoo.a中获取一些符号。
我有第三个图书馆,baz,我正试图链接到吧。在调用链接器时,我得到有关条形中缺少符号的错误(对应于foo中的符号)。 nm
告诉我这些符号存在于libfoo.a中,但不存在于libbar.so中;但是,libbar.so中的libfoo.a中有一些符号。
为什么不复制所有符号?
答案 0 :(得分:5)
.a
库不是“静态对象”。 .a
文件是一个归档,在理论上与tar
类似,但是由ar
命令生成的格式不同。存档中的每个对象都是独特且个性化的。通常这些对象是.o
个文件,它们是已编译的未链接对象。其中一个.o
文件中的所有符号将在链接期间包含在另一个文件中(ld
)。但是,在链接期间并不需要存档中的所有对象,其他目标文件中的符号将不会在链接文件中看到。
例如,在libdialog.a
中,有mouse.o
和columns.o
个目标文件。您的程序使用列,但不使用鼠标功能。因此,您的计划包含columns.o
中的所有符号,但mouse.o
中没有符号。
使用“共享对象”(.so
),它是一个单个对象,因此链接它将包括对象中的所有符号,是否需要。在上面的示例中,如果我们与libdialog.so
相关联,那么即使未使用基于鼠标的代码,该程序也会包含来自columns.o
和mouse.o
的符号。
生成共享对象(.so
)时,使用存档(.a
)时会应用相同的链接规则。因此.so
文件将仅包含存档中使用的.o
文件中的符号。