在 C++ 项目中,在编译器将源代码编译为对象文件 (*.obj) 之后,将执行链接步骤。 链接器 (link.exe) 可将对象文件合并到单个可执行文件中。
链接器选项可以在 Visual Studio 内部或外部进行设置。 在 Visual Studio 中,通过右键单击“解决方案资源管理器”中的项目节点并选择“属性”以显示属性页来访问链接器选项。 在左窗格中选择“链接器”以展开节点并查看所有选项。
链接器命令行语法
在 Visual Studio 外部运行链接器时,可以通过一种或多种方式指定输入:
- 在命令行上
- 使用命令文件
- 在环境变量中
链接器首先处理 LINK 环境变量中指定的选项,然后按照在命令行上和在命令文件中指定的顺序处理选项。 如果某个选项使用不同的自变量重复,则最后一个处理的选项优先级较高。
选项适用于整个生成;任何选项都无法应用于特定输入文件。
若要运行 link.exe,请使用以下命令语法:
link arguments
arguments 包含选项和文件名,可以按任意顺序指定。 首先处理选项,然后处理文件。 使用一个或多个空格或制表符分隔自变量。
注意
只能从 Visual Studio 命令提示符提示启动此工具。 不能从系统命令提示符或从文件资源管理器启动此工具。
命令行
在命令行上,选项由选项说明符(短划线 (-) 或正斜杠 (/))及后跟的选项名称构成。 选项名称不能缩写。 一些选项带有一个自变量,在冒号 (:) 之后指定。 选项规范中不允许使用空格或制表符,但 /COMMENT 选项中带引号的字符串除外。 以十进制或 C 语言表示法指定数值自变量。 选项名称及其关键字或文件名自变量不区分大小写,但作为自变量的标识符区分大小写。
若要将文件传递给链接器,请在命令行上的 link.exe 命令后指定文件名。 可以使用文件名指定绝对路径或相对路径,并在文件名中使用通配符。 如果你省略了点 (.) 和文件扩展名,则链接器在查找文件时将假设扩展名为 .obj。 链接器不使用文件扩展名或缺少文件扩展名来对文件的内容进行假设。 它通过检查文件来确定文件类型,并相应地对其进行处理。
注意
各种链接器标志采用文件名。 无论是指定相对路径还是绝对路径,如果完全限定的文件名超过 MAX_PATH (260 个字符),链接器在搜索库时可能会失败。 如果遇到此问题,请尝试使用较短的路径。
如果成功(没有错误),则链接器将返回零。 否则,它将返回停止了链接的错误号。 例如,如果链接器生成 LNK1104,则链接器返回 1104。 相应地,在发生错误时链接器返回的最小错误号为 1000。 返回值 128 表示操作系统或 .config 文件存在配置问题;加载程序未加载 link.exe 或 c2.dll。
链接器命令文件
可以通过命令文件的形式将命令行自变量传递给 link.exe。 若要将命令文件指定到链接器,请使用以下语法:
link @commandfile
commandfile 是文本文件的名称。 符号 (@) 和文件名之间不允许使用空格或制表符。 没有默认扩展名;必须指定完整文件名,包括任何扩展名。 无法使用通配符。 可以使用文件名指定绝对路径或相对路径。 不得超过 MAX_PATH (260 个字符)。 链接器不使用环境变量来搜索文件。
在命令文件中,自变量由空格或制表符(就像在命令行上一样)以及换行符进行分隔。
可以在命令文件中指定全部或部分命令行。 可以在 link.exe 命令中使用多个命令文件。 链接器接受命令文件输入,就像在命令行上的该位置指定一样。 不能嵌套命令文件。 除非指定了 /NOLOGO 选项,否则链接器会回显命令文件的内容。
示例
以下命令生成一个 DLL。 它在单独的命令文件中传递对象文件和库的名称,并使用第三个命令文件来指定 /EXPORTS 选项:
link /dll @objlist.txt @liblist.txt @exports.txt
LINK 环境变量
链接器可以识别以下环境变量:
-
LINK和_LINK_(如果已定义)。 链接器预置LINK环境变量中定义的选项和自变量并在处理之前将_LINK_环境变量中定义的选项和自变量附加到命令行。 -
LIB(如果已定义)。 当链接器搜索在命令行上或通过LIB选项指定的对象、库或其他文件时,链接器会使用/BASE路径。 它还使用LIB路径查找在对象中指定的.pdb文件。LIB变量可以包含一个或多个路径规范,用分号分隔。 一个路径必须指向\libMicrosoft C++安装的子目录。 -
PATH,如果该工具需要运行CVTRES并且在link.exe自身所在的目录中找不到文件。 (link.exe需要CVTRES链接文件.res。)PATH必须指向\binMicrosoft C++安装的子目录。 -
TMP,用于在链接 OMF 或.res文件时指定目录。