ZHCUAU3J January 2018 – March 2024
对象库属于分区存档文件,其中包含目标文件。通常,一组相关模块被组合起来构成库。将对象库指定为链接器输入时,链接器会包含定义现有未解析符号引用的所有库成员。您可以使用归档器来构建和维护库。节 10.1介绍了关于归档器的更多信息。
使用对象库可以缩减可执行模块的链接时间和大小。通常,如果在链接时指定了包含函数的目标文件,则无论是否会使用对应函数,都会链接该文件;不过,如果存档库中存在相同的函数,那么只有引用了对应函数时,才会包含该文件。
指定库的顺序非常重要,因为链接器在搜索库时仅包含那些会解析未定义符号的成员。您可以根据需要多次指定同一个库;只要包含库,链接器就会搜索库。此外,您可以使用 --reread_libs 选项来重新读取库,直到没有其他引用可供解析(请参阅节 12.4.15.3)。库包含一个表格,其中列出了该库中定义的所有外部符号;链接器会通过该表格进行搜索,直到确定无法使用该库来解析任何其他引用。
以下示例会链接多个文件和库并做下列假设:
如果您输入:
cl7x --run_linker f1.c.obj f2.c.obj liba.lib libc.lib
那么:
不过,如果您输入:
cl7x --run_linker f1.c.obj f2.c.obj libc.lib liba.lib
那么,对 clrscr 的引用会由 libc.lib 的成员 1 满足。
如果库中没有定义任何链接的文件引用符号,您可以使用 --undef_sym 选项来强制链接器包含库成员。(请参阅节 12.4.30。)下例会在链接器的全局符号表中创建一个未定义的符号 rout1:
cl7x --run_linker --undef_sym=rout1 libc.lib
如果 libc.lib 的任何成员定义了 rout1,链接器会包含该成员。
会根据 SECTIONS 指令的默认分配算法来分配库成员;请参阅节 12.5.5。
节 12.4.15 介绍了几种指定对象库所在目录的方法。