ZHCU947E June 2015 – January 2023
对象库属于分区存档文件,其中包含目标文件。通常,一组相关模块被组合起来构成库。将对象库指定为链接器输入时,链接器会包含定义现有未解析符号引用的所有库成员。您可以使用归档器来构建和维护库。GUID-24489C86-B78A-4DB9-8D35-30568EC894E0.html#GUID-24489C86-B78A-4DB9-8D35-30568EC894E0介绍了关于归档器的更多信息。
使用对象库可以缩减可执行模块的链接时间和大小。通常,如果在链接时指定了包含函数的目标文件,则无论是否会使用对应函数,都会链接该文件;不过,如果存档库中存在相同的函数,那么只有引用了对应函数时,才会包含该文件。
指定库的顺序非常重要,因为链接器在搜索库时仅包含那些会解析未定义符号的成员。您可以根据需要多次指定同一个库;只要包含库,链接器就会搜索库。此外,您可以使用 --reread_libs 选项来重新读取库,直到没有其他引用可供解析(请参阅GUID-9691D958-ECC8-42D3-83DE-CF150E71C571.html#GUID-9691D958-ECC8-42D3-83DE-CF150E71C571)。库包含一个表格,其中列出了该库中定义的所有外部符号;链接器会通过该表格进行搜索,直到确定无法使用该库来解析任何其他引用。
以下示例会链接多个文件和库并做下列假设:
如果您输入:
cl6x --run_linker f1.c.obj f2.c.obj liba.lib libc.lib
那么:
不过,如果您输入:
cl6x --run_linker f1.c.obj f2.c.obj libc.lib liba.lib
那么,对 clrscr 的引用会由 libc.lib 的成员 1 满足。
如果库中没有定义任何链接的文件引用符号,您可以使用 --undef_sym 选项来强制链接器包含库成员。(请参阅GUID-E66BCDD3-45EF-49A9-8649-3F1929E2A46C.html#GUID-E66BCDD3-45EF-49A9-8649-3F1929E2A46C。)下例会在链接器的全局符号表中创建一个未定义的符号 rout1:
cl6x --run_linker --undef_sym=rout1 libc.lib
如果 libc.lib 的任何成员定义了 rout1,链接器会包含该成员。
会根据 SECTIONS 指令的默认分配算法来分配库成员;请参阅GUID-6E6B4A54-DD1F-4CA9-92C1-21E822F3090C.html#GUID-6E6B4A54-DD1F-4CA9-92C1-21E822F3090C。
GUID-643C93C9-0EE2-4ED0-B709-BE7477C60C3B.html#GUID-643C93C9-0EE2-4ED0-B709-BE7477C60C3B 介绍了几种指定对象库所在目录的方法。