我有一个库,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.o
和columns.o
目标文件.您的程序使用列,但不使用鼠标功能.因此,您的程序包含所有符号columns.o
,但不包括任何符号mouse.o
.
使用"共享对象"(.so
),它是一个单个对象,因此链接它将包括对象中的所有符号,是否需要.在上面的示例中,如果我们链接libdialog.so
,则程序将包括来自两者的符号columns.o
,mouse.o
即使未使用基于鼠标的代码.
生成共享对象(.so
)时,使用archive(.a
)时会应用相同的链接规则.因此,该.so
文件将仅包含.o
存档中使用的文件中的符号.