ALIGN(节对齐)
/ALIGN[:number]
其中:number(对齐值)。
/ALIGN 选项指定程序线性地址空间中每一节的对齐方式。number 参数以字节为单位,并且必须是 2 的幂。默认值是 4K (4096)。如果对齐方式产生无效的图像,则链接器发出警告。
除非正在编写诸如设备驱动程序的应用程序,否则应不需要修改对齐方式。
可以用 /SECTION 选项的对齐参数修改特定节的对齐方式。
指定的对齐值不能小于最大的节对齐。
==============================================================
/BASE(基址)
/BASE:{address[,size] | @filename,key}
/BASE 选项设置程序的基址,重写 .exe 文件(在 0x400000 处)或 DLL(在 0x10000000 处)的默认位置。操作系统首先尝试在程序 的指定或默认基址加载程序。如果该基址处没有足够的空间可用,则系统将重定位程序。若要防止重定位,请使用 /FIXED 选项。
如果 address 不是 64K 的倍数,链接器将发出错误。您可以选择指定程序的大小,以便链接器在程序超过您指定的大小时发出警告。
==============================================================
/DEBUG(生成调试信息)
/DEBUG 选项创建 .exe 文件或 DLL 的调试信息。
链接器将调试信息放在程序数据库 (PDB) 中。它在后面的程序生成期间更新 PDB。
为调试创建的 .exe 文件或 DLL 包含相应 PDB 的名称和路径。调试器在您调试程序时读取嵌入的名称并使用 PDB。链接器使用程序的基名称 和扩展名 .pdb 命名程序数据库,并嵌入它的创建路径。若要重写该默认值,请设置 /PDB 并指定不同的文件名。
编译器的仅限行号 (/Zd) 或 C7 兼容 (/Z7) 选项使编译器将调试信息保留在 .obj 文件中。还可以使用程序数据库 (/Zi) 编译器选项将调试信息 存储在 .obj 文件的 PDB 中。链接器首先在写入 .obj 文件的绝对路径中查找对象的 PDB,然后在包含 .obj 文件的目录中查找。不 能指定对象的 PDB 文件名或链接器的位置。
指定 /DEBUG 时暗含 /INCREMENTAL。
/DEBUG 将 /OPT 选项的默认值从 REF 更改为 NOREF 以及从 ICF 更改为 NOICF(因此,需要显式指定 /OPT:REF 或 /OPT:ICF)。
==============================================================
/DEF(指定模块定义文件)
/DEF:filename (要传递到链接器的模块定义文件 (.def) 的名称。)
备注
/DEF 选项将模块定义文件 (.def) 传递到链接器。只有一个 .def 文件可以指定给 LINK。有关 .def 文件的详细信息,请参见模块定义文件。
==============================================================
/DEFAULTLIB(指定默认库)
/DEFAULTLIB:library
library 解析外部引用时搜索的库名。
备注
/DEFAULTLIB 选项将一个 library 添加到 LINK 在解析引用时搜索的库列表。用 /DEFAULTLIB 指定的库在命令行上指定的库之后和 .obj 文件中指定的默认库之前被搜索。
忽略所有默认库 (/NODEFAULTLIB) 选项重写 /DEFAULTLIB:library。如果在两者中指定了相同的 library 名 称,忽略库 (/NODEFAULTLIB:library) 选项将重写 /DEFAULTLIB:library。
==============================================================
/DLL(生成 DLL)
/DLL 选项生成作为主输出文件的 DLL。DLL 通常包含可由另一个程序使用的导出。有三种指定导出的方法,按照建议的使用顺序依次为:
源代码中的 __declspec(dllexport) (仅限C/C++语言使用)
.def 文件中的 EXPORTS 语句
LINK 命令中的 /EXPORT 规范
程序可使用一种以上的方法。
另一种生成 DLL 的方法是使用 LIBRARY 模块定义语句。将 /BASE 和 /DLL 选项连用等效于 LIBRARY 语句。
==============================================================
/DRIVER(Windows NT 内核模式驱动程序)
/DRIVER[:UPONLY | :WDM]
使用 /DRIVER 链接器选项生成 Windows NT 内核模式驱动程序。
/DRIVER:UPONLY 使链接器将 IMAGE_FILE_UP_SYSTEM_ONLY 位添加到输出头的特性中,以指定它是单处理器 (UP) 驱动程序。操作系统将拒绝在多处理器 (MP) 系统上加载 UP 驱动程序。
/DRIVER:WDM 使链接器设置可选头的 DllCharacteristics 字段中的 IMAGE_DLLCHARACTERISTICS_WDM_DRIVER 位。
如果未指定 /DRIVER,则链接器不会设置这些位。
如果指定了 /DRIVER:
/FIXED:NO 有效 ( /FIXED(固定基址))。
输出文件的扩展名将为 .sys。使用 /OUT 更改默认文件名和扩展名 ( /OUT(输出文件名))。
==============================================================
/ENTRY(入口点符号)
/ENTRY:function
function
一个函数,指定 .exe 文件或 DLL 的用户定义起始地址。
备注
/ENTRY 选项指定一个入口点函数作为 .exe 文件或 DLL 的起始地址。
必须用 __stdcall 调用约定来定义函数。必须按 WinMain(对于 .exe 文件)或 DllEntryPoint(对于 DLL)的 Win32 API 中记录的内容定义参数和返回值。建议让链接器设置入口点,以便 C 运行时库正确初始化,并执行静态对象的 C++ 构造函数。
默认情况下的入口点函数如下
使用 /SUBSYSTEM:CONSOLE 的应用程序;调用 main(或 wmain)
使用 /SUBSYSTEM:WINDOWS 的应用程序;调用 WinMain(或 wWinMain),它必须用 __stdcall 来定义
DLL;调用 DllMain(如果存在),DllMain 必须用 __stdcall 来定义
==============================================================
/EXPORT(导出函数)
/EXPORT:entryname[,@ordinal[,NONAME]][,DATA]
备注
使用该选项,可以从程序导出函数,以便其他程序可以调用该函数。也可以导出数据。通常在 DLL 中定义导出。
entryname 是调用程序要使用的函数或数据项的名称。ordinal 在导出表中指定范围在 1 至 65,535 的索引;如果没有指定 ordinal,则 LINK 将分配一个。NONAME 关键字只将函数导出为序号,没有 entryname。
有三种导出定义的方法,按照建议的使用顺序依次为:
源代码中的 __declspec(dllexport) (仅限C/C++语言)
.def 文件中的 EXPORTS 语句
LINK 命令中的 /EXPORT 规范
==============================================================
/FIXED(固定基址)
/FIXED[:NO]
备注
/FIXED 选项通知操作系统只在其首选基址加载程序。如果首选基址不可用,则操作系统将不加载该文件。有关更多信息,请参见 /BASE(基址)。
默认情况下,/FIXED:NO 是生成 DLL 时的默认值,/FIXED 是任何其他项目类型的默认值。
当指定 /FIXED 时,LINK 不生成程序中的重定位节。在运行时,如果操作系统无法在该地址加载程序,它将发出错误信息并且不加载该程序。
指定 /FIXED:NO 以在程序中生成重定位节。
不要在生成 Windows NT 的设备驱动程序时使用 /FIXED。
==============================================================
/HEAP(设置堆大小)
/HEAP:reserve[,commit]
备注
/HEAP 选项设置堆的大小(以字节为单位)。此选项仅在生成 .exe 文件时使用。
reserve 参数指定虚拟内存中总的堆分配。默认堆大小为 1 MB。链接器将指定值向上舍入为最接近的 4 个字节。
可选 commit 参数取决于操作系统的解释。在 Windows NT/Windows 2000 中,它指定一次分配的物理内存的数量。提交的虚拟 内存导致空间被保留在页面文件中。更高的 commit 值在应用程序需要更多堆空间时可节省时间,但会增加内存需求并有可能延长启动时间。
以十进制或 C 语言表示法指定 reserve 值和 commit 值。
通过带 HEAPSIZE 的模块定义文件也可以实现该功能。
==============================================================
/INCLUDE(强制符号引用)
/INCLUDE:symbol
其中:
symbol
指定要添加到符号表的符号。
备注
/INCLUDE 选项通知链接器将指定的符号添加到符号表。
若要指定多个符号,请在符号名称之间键入逗号 (,)、分号 (;) 或空格。在命令行上,对每个符号指定一次 /INCLUDE:symbol。
链接器通过将包含符号定义的对象添加到程序来解析 symbol。该功能对于添包含不会链接到程序的库对象非常有用。
用该选项指定符号将通过 /OPT:REF 重写该符号的移除。
==============================================================
/LIBPATH(附加的 Libpath)
/LIBPATH:dir
其中:
dir
在链接器搜索 LIB 环境选项中指定的路径之前,指定它将要搜索的路径。
备注
使用 /LIBPATH 选项重写环境库路径。链接器将首先在该选项所指定的路径中搜索,然后在 LIB 环境变量中所指定的路径中搜索。对于您输入的每 个 /LIBPATH 选项,只能指定一个目录。如果要指定一个以上的目录,则必须指定多个 /LIBPATH 选项。链接器然后将按顺序搜索指定的目 录。
==============================================================
/MACHINE(指定目标平台)
/MACHINE:{ARM|EBC|IA64|MIPS|MIPS16|MIPSFPU|MIPSFPU16| SH4|THUMB|X64|X86}
备注
/MACHINE 选项指定程序的目标平台。
通常情况下,不需要指定 /MACHINE 选项。LINK 从 .obj 文件中推断出计算机类型。但在某些情况下,LINK 无法确定计算机类型并发出链接器工具错误 LNK1113。如果发生了此类错误,请指定 /MACHINE。
==============================================================
/MAP(生成映射文件)
/MAP[:filename]
其中:
filename
用户指定的映射文件名称。它将替换默认名称。
备注
/MAP 选项通知链接器创建映射文件。
默认情况下,链接器用程序的基名称和扩展名 .map 命名映射文件。可选的 filename 使您得以重写映射文件的默认名称。
映射文件是一个文本文件,包含有关被链接程序的下列信息:
模块名称,为文件的基名称
时间戳,来自程序文件头(不是来自文件系统)
程序中的组列表,包括每个组的起始地址(节:偏移量的形式)、长度、组名和类
公共符号的列表,包括每个地址(节:偏移量的形式)、符号名称、平直地址和包含符号定义的 .obj 文件
入口点(节:偏移量的形式)
/MAPINFO 选项指定要包括在映射文件中的附加信息。
==============================================================
/MAPINFO(包含映射文件中的信息)
/MAPINFO:EXPORTS
备注
/MAPINFO 选项通知链接器包含映射文件中指定的信息,如果指定 /MAP 选项,则创建该映射文件。EXPORTS 通知链接器包含导出函数。
==============================================================
/MERGE(合并节)
/MERGE:from=to
/MERGE 选项将第一个节 (from) 和第二个节 (to) 合并在一起,将结果节命名为 to。例如 /merge:.rdata=.text。
如果第二个节不存在,则 LINK 将节 from 重命名为 to。
/MERGE 选项对于创建 VxD 和重写编译器生成的节名非常有用。
==============================================================
/NODEFAULTLIB(忽略库)
/NODEFAULTLIB[:library]
其中:
library
当链接器解析外部引用时使链接器忽略的库。
备注
/NODEFAULTLIB 选项通知链接器将一个或多个默认库从链接器解析外部引用时所搜索的库列表中移除。
要创建一个不包含默认库引用的 .obj 文件,请使用 /Zl(省略默认库名)。
默认情况下,/NODEFAULTLIB 从它解析外部引用时所搜索的库列表中移除所有默认库。可选 library 参数使您得以将指定的库从它解析外部引用时所搜索的库列表中移除。为每个要排除的库指定一个 /NODEFAULTLIB 选项。
链接器解析外部定义的引用时,首先通过在您显式指定的库中搜索,然后在用 /DEFAULTLIB 选项指定的默认库中搜索,最后在 .obj 文件中命名的默认库中搜索。
/NODEFAULTLIB:library 重写 /DEFAULTLIB:library(如果在这两者中指定相同的 library 名称)。
例如,如果在没有 C 运行时库情况下使用 /NODEFAULTLIB 生成程序,可能还需要使用 /ENTRY 指定程序中的入口点(函数)。有关更多信息,请参见 C Run-Time Libraries。
==============================================================
/NOENTRY(无入口点)
/NOENTRY
备注
创建纯资源 DLL 时要求 /NOENTRY 选项。
==============================================================
/NOLOGO(取消显示启动版权标志)(链接器)
/NOLOGO
备注
/NOLOGO 选项防止显示版权消息和版本号。
该选项还取消命令文件的回显。有关详细信息,请参见 LINK 命令文件。
默认情况下,该信息由链接器发送到“输出”窗口。在命令行上,它被发送到标准输出并可以重定向到文件。
==============================================================
/OPT(优化)
控制 LINK 在生成期间执行的优化。
/OPT:{REF | NOREF}
/OPT:{ICF[=iterations] | NOICF}
/OPT:{WIN98 | NOWIN98}
参数
REF | NOREF
/OPT:REF 清除从未引用的函数和/或数据,而 /OPT:NOREF 保留从未引用的函数和/或数据。
默认情况下,LINK 移除未引用的封装函数。如果对象已经用 /Gy 选项编译过,它包含封装函数 (COMDAT)。此优化称为可传递的 COMDAT 消除。若要重写该默认值并在程序中保留未引用的 COMDAT,请指定 /OPT:NOREF。可以使用 /INCLUDE 选项重写特 定符号的移除。
如果指定了 /DEBUG,/OPT 的默认项是 NOREF(否则,为 REF),而且所有函数都保留在映像中。若要重写此默认项并优化调试生成,请指定 /OPT:REF。/OPT:REF 选项禁用增量链接。
必须显式地将数据标记为 COMDAT;使用 __declspec(selectany)。
如果指定了 /OPT:REF,默认情况下 /OPT:ICF 处于打开状态。如果需要 /OPT:REF 而不是 /OPT:ICF,则必须指定下面的内容:
link /opt:ref /opt:noicf
指定 /OPT:ICF 不激活 /OPT:REF 选项。
ICF[= iterations ] | NOICF
使用 /OPT:ICF[=iterations] 执行相同的 COMDAT 折叠。可以从链接器输出中移除多余的 COMDAT。 iteration 指定遍历符号以查找重复项的次数。默认迭代次数是两次。附加的迭代可以找到前一次迭代中通过折叠未发现的重复项。
请 注意,默认情况下 ICF 有效时(显式指定 /OPT:REF),与显式指定 /OPT:REF,ICF 时,链接器行为是有区别的。默认的带 /OPT:REF 的 ICF 不折叠只读数据。这包括任何 .rdata、.pdata 和 .xdata。但是,默认的带 /OPT:REF 的 ICF 导致在为 Itanium 和 x64 生成映像时折叠较少的函数,因为这些模块中的函数具有更多的只读数据依赖项,例如 .pdata 和 .xdata。若要获得完整的 ICF,请显式指定 /OPT:ICF。
函数通过 /Gy 编译器选项放在 COMDAT 中,常数数据放在 COMDAT 中。有关如何为折叠指定数据的示例,请参见 selectany。
如果 REF 处于打开状态并且需要在调试生成中显式打开,则默认情况下 ICF 处于打开状态。如果指定了 REF,则可以指定 NOICF。
注意
/OPT:ICF 可导致相同的地址分配到不同的函数或只读数据成员(用 /Gy 编译的常数变量)。因此,/OPT:ICF 可中断依赖于不同的函数或只读数据成员的地址的程序。有关更多信息,请参见 /Gy(启用函数级链接)。
WIN98 | NOWIN98
WIN98 和 NOWIN98 控制最终映像中的节对齐。对于 Windows 98 应用程序,最好是在 4K 的边界上对齐节,以改进加载时间(允许 Windows 98 内存管理器缓存可执行图像同时最少化浪费的空间)。默认情况下,此选项在链接器中是打开的,因此需要指定 /OPT: NOWIN98 以获得精简(但在 Windows 98 上较慢)的应用程序版本。
默认情况下,WIN98 处于打开状态。WIN98 在下列情况下是关闭的:
使用了 /ALIGN。
/MACHINE 的目标不是 x86。
/SUBSYSTEM 指定 WINDOWS 或 CONSOLE 以外的内容。
备注
优化通常是以增加链接时间为代价,减小图像大小并加快程序速度。
可使用 /VERBOSE 选项查看由 /OPT:REF 移除的函数和由 /OPT:ICF 折叠的函数。
==============================================================
/ORDER(按顺序放置函数)
/ORDER:@filename
参数
filename
指定 COMDAT 函数链接顺序的文本文件。
备注
/ORDER 选项通知 LINK 按预先确定的顺序将特定的 COMDAT 放置到图像中以优化程序。LINK 按指定的顺序在图像的每个节中放置函数。
在 filename 中指定顺序。filename 是按照您希望链接 COMDAT 的顺序列出 COMDAT 的文本文件(响应文件)。 filename 中的每一行包含一个 COMDAT 的名称。如果对象已经用 /Gy 选项编译过,它包含 COMDAT。函数名区分大小写。
LINK 使用标识符的修饰形式。编译器在创建 .obj 文件时修饰标识符。当需要将标识符的修饰形式指定给链接器时,可使用 DUMPBIN 工具获取它。有关修饰名的更多信息,请参见修饰名。
如果使用了多个 /ORDER 规范,指定的最后一个规范有效。
排序允许将一个函数与该函数调用的函数组合,通过交换优化来优化程序的分页行为。还可将经常调用的函数分在一组。这些技术增加了调用的函数在需要它时位于内存中从而不必从磁盘分页的可能性。
链接器在 filename 中的每个修饰名前放置一个下划线 (_),只要名称不是以问号 (?) 或 at 符 (@) 开头。例如,如果对象文件包 含 extern "C" int func(int) 和 int main(void),则 DUMPBIN /SYMBOLS 将列出这些修饰名:
009 00000000 SECT3 notype () External | _func
00A 00000008 SECT3 notype () External | _main
不过,在顺序文件中指定的名称应为 func 和 main。
/ORDER 选项禁用增量链接。
注意
LINK 无法对静态函数进行排序,因为静态函数名不是公共符号名。如果指定了 /ORDER,在顺序文件中将为每个静态的或者没有找到的符号生成链接器警告 LNK4037。
==============================================================
/OUT(输出文件名)
/OUT:filename
其中:
filename
用户指定的输出文件名。它将替换默认名称。
备注
/OUT 选项重写链接器创建的程序的默认名称和位置。
默认情况下,链接器用指定的第一个 .obj 文件的基名称和适当的扩展名(.exe 或 .dll)来组成文件名。
该选项设置 .mapfile 或导入库的默认基名称。有关详细信息,请参见生成映射文件 (/MAP) 和 /IMPLIB。
==============================================================
/RELEASE(设置校验和)
/RELEASE
备注
/RELEASE 选项在 .exe 文件头中设置校验和。
操作系统要求设备驱动程序的校验和。为设备驱动程序的发布版本设置校验和,以确保与未来的操作系统兼容。
当指定 /SUBSYSTEM:NATIVE 选项时,默认情况下设置 /RELEASE 选项。
==============================================================
/SECTION(指定节属性)
/SECTION:name,[[!]{DEKPRSW}][,ALIGN=#]
备注
/SECTION 选项更改节的属性,当节的 .obj 文件被编译时重写属性集。
可移植可执行 (PE) 文件中的节大致等效于新的可执行 (NE) 文件中的段或资源。节包含代码或数据。与段不同,节是连续内存的块,没有大小限制。 有些节包含程序声明和直接使用的代码或数据,而有些数据节是由链接器和库管理器 (lib.exe) 创建的,包含了对操作系统来说至关重要的信息。有关 NE 文件的更多信息,请参见知识库文章“Executable-File Header Format”(Q65122)。可以在 MSDN Library 中或 http://support.microsoft.com/default.aspx?ln=zh-cn 上找到知识库文章。
指定冒号 (:) 和节 name。name 区分大小写。
不要使用以下名称,因为它们与标准名称冲突。例如,.sdata 用在 RISC 平台上:
.arch
.bss
.data
.edata
.idata
.pdata
.rdata
.reloc
.rsrc
.sbss
.sdata
.srdata
.text
.xdata
为节指定一个或多个属性。以下列出的属性字符不区分大小写。必须指定您希望节具有的所有属性;省略的属性字符将导致该属性位被关闭。如果不指定 R、W 或 E,则现有的读、写或可执行状态保持不变。
若要取反属性,请在属性字符前使用一个感叹号 (!)。属性字符的含义如下所示:
字符 属性 含义
E Execute 节是可执行的
R Read 允许对数据进行读取操作
W Write 允许对数据进行写操作
S Shared 在所有加载图像的进程中共享节
D Discardable 将节标记为可放弃
K Cacheable 将节标记为不可缓存
P Pageable 将节标记为不可分页
K 和 P 比较特殊,因为与其对应的节标志表示相反的含义。如果在 .text 节 (/SECTION:.text,K) 上指定它们之中的一个,当运行 带 /HEADERS 选项 Dumpbin 时在节标志中将没有区别;它已被隐式缓存了。若要移除默认值,请指定 /SECTION:.text,! K,DUMPBIN 将显示节特性,包括“未缓存。”。
没有设置 E、R 或 W 的 PE 文件中的节可能无效。
ALIGN=# 使您得以为特定的节指定对齐值。有关更多信息,请参见 /ALIGN。
==============================================================
/STACK(堆栈分配)
/STACK:reserve[,commit]
备注
/STACK 选项设置堆栈的大小(以字节为单位)。此选项仅在生成 .exe 文件时使用。
该选项指定虚拟内存中的总的堆栈分配。默认堆栈大小为 1 MB。链接器将指定值向上舍入为最接近的 4 个字节。
commit 取决于操作系统所作的解释。在 Windows NT 和 Windows 2000 中,它指定一次分配的物理内存量。提交的虚拟内存导致空间被保留在 页面文件中。更高的 commit 值在应用程序需要更多堆栈空间时可节省时间,但会增加内存需求并有可能延长启动时间。
以十进制或 C 语言表示法指定 reserve 值和 commit 值。
设置堆栈大小的另一种方法是使用模块定义 (.def) 文件中的 STACKSIZE 语句。如果两者都指定,则 STACKSIZE 重写堆栈分配 (/STACK) 选项。可以使用 EDITBIN 工具在生成 .exe 文件之后更改堆栈。
==============================================================
/STUB(MS-DOS 存根 (stub) 文件名)
/STUB:filename
其中:
filename
MS-DOS 应用程序。
备注
/STUB 选项将 MS-DOS 存根 (stub) 程序附加到 Win32 程序。
如果在 MS-DOS 中执行文件,则将调用存根 (stub) 程序。它通常显示适当的消息;然而,任何有效的 MS-DOS 应用程序都可以是存根 (stub) 程序。
在命令行上冒号 (:) 之后,为存根 (stub) 程序指定 filename。如果文件不是可执行文件,则链接器检查 filename 并发出错误信息。程序必须是 .exe 文件;.com 文件对于存根 (stub) 程序无效。
如果不使用该选项,则链接器附加发出以下消息的默认存根 (stub) 程序:
This program cannot be run in MS-DOS mode.
当生成虚拟设备驱动程序时,filename 使用户得以指定文件名,该文件名包含要用于 VXD 中而不是默认头的 IMAGE_DOS_HEADER 结构(在 WINNT.H 中定义)。
==============================================================
/SUBSYSTEM(指定子系统)
/SUBSYSTEM:{CONSOLE|EFI_APPLICATION|EFI_BOOT_SERVICE_DRIVER|
EFI_ROM|EFI_RUNTIME_DRIVER|NATIVE|POSIX|WINDOWS|WINDOWSCE}
[,major[.minor]]
备注
其中:
CONSOLE
Win32 字符模式应用程序。控制台应用程序是操作系统提供的控制台。如果定义 main 或 wmain,则 CONSOLE 为默认值。
可扩展固件接口
EFI_* 子系统。有关更多信息,请参见 EFI 规范。有关示例,请参见 Intel 网站。最低和默认版本为 1.0。
NATIVE
Windows NT 的设备驱动程序。如果指定 /DRIVER:WDM,则 NATIVE 为默认值。
POSIX
在 Windows NT 中与 POSIX 子系统运行的应用程序。
WINDOWS
应用程序并不需要控制台,因为它可以创建自己的用户交互窗口。如果定义 WinMain 或 wWinMain,则 WINDOWS 为默认值。
WINDOWSCE
在 Windows CE 设备上运行的应用程序。
major 和 minor(可选)
指定子系统的要求的最低版本。参数为 0 到 65,535 之间的十进制数。有关详细信息,请参见“备注”。版本号没有上限。
备注
/SUBSYSTEM 选项通知操作系统如何运行 .exe 文件。
==============================================================
/VERSION(版本信息)
/VERSION:major[.minor]
其中:
major 和 minor
希望 .exe 或 .dll 文件头中包含的版本号。
备注
/VERSION 选项通知链接器将版本号放置在 .exe 或 .dll 文件头中。使用 DUMPBIN /HEADERS 查看 OPTIONAL HEADER VALUES 的图像版本字段,以查看 /VERSION 的效果。
major 和 minor 参数是从 0 到 65,535 的范围内的十进制数。默认值为 0.0 版。
用 /VERSION 指定的信息不影响在 Windows 资源管理器中查看应用程序属性时所显示的应用程序的版本信息。该版本信息来自用于生成应用程序的资源文件。有关更多信息,请参见版本信息编辑器。
另一种插入版本号的方法是用 VERSION 模块定义语句。
==============================================================
/VERBOSE(打印进度消息)
/VERBOSE[:ICF |:LIB |:REF |:SAFESEH]
备注
链接器将有关链接会话进度的信息发送到“输出”窗口。在命令行上,信息被发送到标准输出,并可以重定向到文件。
选项 说明
/VERBOSE
显示有关链接进度的详细信息。
/VERBOSE:ICF
显示关于从使用 /OPT:ICF 中产生的链接器活动的信息。
/VERBOSE:LIB
显示进度消息,仅指示所搜索的库。
所显示的信息包括库搜索进程,同时还列出每个库和对象名(包括完整路径),正从库中解析的符号,以及引用该符号的对象的列表。
/VERBOSE:REF
显示关于从使用 /OPT:REF 中产生的链接器活动的信息。
/VERBOSE:SAFESEH
显示与在未指定 /SAFESEH 时哪些模块与安全异常处理不兼容的有关信息。
==============================================================
/WX(将链接器警告视为错误)
/WX[:NO]
备注
如果链接器生成警告,/WX 将不会生成任何输出文件。
这与编译器的 /WX 类似(有关更多信息,请参见 /w、/Wn、/WX、/Wall、/wln、/wdn、/wen、/won(警告等级))。但是,为编译指定 /WX 并不意味着 /WX 在链接阶段同样有效;必须为每种工具都显式指定 /WX。
默认情况下,/WX 不起作用。若要将链接器警告视为错误,请指定 /WX。/WX:NO 等同于不指定 /WX。
/ALIGN[:number]
其中:number(对齐值)。
/ALIGN 选项指定程序线性地址空间中每一节的对齐方式。number 参数以字节为单位,并且必须是 2 的幂。默认值是 4K (4096)。如果对齐方式产生无效的图像,则链接器发出警告。
除非正在编写诸如设备驱动程序的应用程序,否则应不需要修改对齐方式。
可以用 /SECTION 选项的对齐参数修改特定节的对齐方式。
指定的对齐值不能小于最大的节对齐。
==============================================================
/BASE(基址)
/BASE:{address[,size] | @filename,key}
/BASE 选项设置程序的基址,重写 .exe 文件(在 0x400000 处)或 DLL(在 0x10000000 处)的默认位置。操作系统首先尝试在程序 的指定或默认基址加载程序。如果该基址处没有足够的空间可用,则系统将重定位程序。若要防止重定位,请使用 /FIXED 选项。
如果 address 不是 64K 的倍数,链接器将发出错误。您可以选择指定程序的大小,以便链接器在程序超过您指定的大小时发出警告。
==============================================================
/DEBUG(生成调试信息)
/DEBUG 选项创建 .exe 文件或 DLL 的调试信息。
链接器将调试信息放在程序数据库 (PDB) 中。它在后面的程序生成期间更新 PDB。
为调试创建的 .exe 文件或 DLL 包含相应 PDB 的名称和路径。调试器在您调试程序时读取嵌入的名称并使用 PDB。链接器使用程序的基名称 和扩展名 .pdb 命名程序数据库,并嵌入它的创建路径。若要重写该默认值,请设置 /PDB 并指定不同的文件名。
编译器的仅限行号 (/Zd) 或 C7 兼容 (/Z7) 选项使编译器将调试信息保留在 .obj 文件中。还可以使用程序数据库 (/Zi) 编译器选项将调试信息 存储在 .obj 文件的 PDB 中。链接器首先在写入 .obj 文件的绝对路径中查找对象的 PDB,然后在包含 .obj 文件的目录中查找。不 能指定对象的 PDB 文件名或链接器的位置。
指定 /DEBUG 时暗含 /INCREMENTAL。
/DEBUG 将 /OPT 选项的默认值从 REF 更改为 NOREF 以及从 ICF 更改为 NOICF(因此,需要显式指定 /OPT:REF 或 /OPT:ICF)。
==============================================================
/DEF(指定模块定义文件)
/DEF:filename (要传递到链接器的模块定义文件 (.def) 的名称。)
备注
/DEF 选项将模块定义文件 (.def) 传递到链接器。只有一个 .def 文件可以指定给 LINK。有关 .def 文件的详细信息,请参见模块定义文件。
==============================================================
/DEFAULTLIB(指定默认库)
/DEFAULTLIB:library
library 解析外部引用时搜索的库名。
备注
/DEFAULTLIB 选项将一个 library 添加到 LINK 在解析引用时搜索的库列表。用 /DEFAULTLIB 指定的库在命令行上指定的库之后和 .obj 文件中指定的默认库之前被搜索。
忽略所有默认库 (/NODEFAULTLIB) 选项重写 /DEFAULTLIB:library。如果在两者中指定了相同的 library 名 称,忽略库 (/NODEFAULTLIB:library) 选项将重写 /DEFAULTLIB:library。
==============================================================
/DLL(生成 DLL)
/DLL 选项生成作为主输出文件的 DLL。DLL 通常包含可由另一个程序使用的导出。有三种指定导出的方法,按照建议的使用顺序依次为:
源代码中的 __declspec(dllexport) (仅限C/C++语言使用)
.def 文件中的 EXPORTS 语句
LINK 命令中的 /EXPORT 规范
程序可使用一种以上的方法。
另一种生成 DLL 的方法是使用 LIBRARY 模块定义语句。将 /BASE 和 /DLL 选项连用等效于 LIBRARY 语句。
==============================================================
/DRIVER(Windows NT 内核模式驱动程序)
/DRIVER[:UPONLY | :WDM]
使用 /DRIVER 链接器选项生成 Windows NT 内核模式驱动程序。
/DRIVER:UPONLY 使链接器将 IMAGE_FILE_UP_SYSTEM_ONLY 位添加到输出头的特性中,以指定它是单处理器 (UP) 驱动程序。操作系统将拒绝在多处理器 (MP) 系统上加载 UP 驱动程序。
/DRIVER:WDM 使链接器设置可选头的 DllCharacteristics 字段中的 IMAGE_DLLCHARACTERISTICS_WDM_DRIVER 位。
如果未指定 /DRIVER,则链接器不会设置这些位。
如果指定了 /DRIVER:
/FIXED:NO 有效 ( /FIXED(固定基址))。
输出文件的扩展名将为 .sys。使用 /OUT 更改默认文件名和扩展名 ( /OUT(输出文件名))。
==============================================================
/ENTRY(入口点符号)
/ENTRY:function
function
一个函数,指定 .exe 文件或 DLL 的用户定义起始地址。
备注
/ENTRY 选项指定一个入口点函数作为 .exe 文件或 DLL 的起始地址。
必须用 __stdcall 调用约定来定义函数。必须按 WinMain(对于 .exe 文件)或 DllEntryPoint(对于 DLL)的 Win32 API 中记录的内容定义参数和返回值。建议让链接器设置入口点,以便 C 运行时库正确初始化,并执行静态对象的 C++ 构造函数。
默认情况下的入口点函数如下
使用 /SUBSYSTEM:CONSOLE 的应用程序;调用 main(或 wmain)
使用 /SUBSYSTEM:WINDOWS 的应用程序;调用 WinMain(或 wWinMain),它必须用 __stdcall 来定义
DLL;调用 DllMain(如果存在),DllMain 必须用 __stdcall 来定义
==============================================================
/EXPORT(导出函数)
/EXPORT:entryname[,@ordinal[,NONAME]][,DATA]
备注
使用该选项,可以从程序导出函数,以便其他程序可以调用该函数。也可以导出数据。通常在 DLL 中定义导出。
entryname 是调用程序要使用的函数或数据项的名称。ordinal 在导出表中指定范围在 1 至 65,535 的索引;如果没有指定 ordinal,则 LINK 将分配一个。NONAME 关键字只将函数导出为序号,没有 entryname。
有三种导出定义的方法,按照建议的使用顺序依次为:
源代码中的 __declspec(dllexport) (仅限C/C++语言)
.def 文件中的 EXPORTS 语句
LINK 命令中的 /EXPORT 规范
==============================================================
/FIXED(固定基址)
/FIXED[:NO]
备注
/FIXED 选项通知操作系统只在其首选基址加载程序。如果首选基址不可用,则操作系统将不加载该文件。有关更多信息,请参见 /BASE(基址)。
默认情况下,/FIXED:NO 是生成 DLL 时的默认值,/FIXED 是任何其他项目类型的默认值。
当指定 /FIXED 时,LINK 不生成程序中的重定位节。在运行时,如果操作系统无法在该地址加载程序,它将发出错误信息并且不加载该程序。
指定 /FIXED:NO 以在程序中生成重定位节。
不要在生成 Windows NT 的设备驱动程序时使用 /FIXED。
==============================================================
/HEAP(设置堆大小)
/HEAP:reserve[,commit]
备注
/HEAP 选项设置堆的大小(以字节为单位)。此选项仅在生成 .exe 文件时使用。
reserve 参数指定虚拟内存中总的堆分配。默认堆大小为 1 MB。链接器将指定值向上舍入为最接近的 4 个字节。
可选 commit 参数取决于操作系统的解释。在 Windows NT/Windows 2000 中,它指定一次分配的物理内存的数量。提交的虚拟 内存导致空间被保留在页面文件中。更高的 commit 值在应用程序需要更多堆空间时可节省时间,但会增加内存需求并有可能延长启动时间。
以十进制或 C 语言表示法指定 reserve 值和 commit 值。
通过带 HEAPSIZE 的模块定义文件也可以实现该功能。
==============================================================
/INCLUDE(强制符号引用)
/INCLUDE:symbol
其中:
symbol
指定要添加到符号表的符号。
备注
/INCLUDE 选项通知链接器将指定的符号添加到符号表。
若要指定多个符号,请在符号名称之间键入逗号 (,)、分号 (;) 或空格。在命令行上,对每个符号指定一次 /INCLUDE:symbol。
链接器通过将包含符号定义的对象添加到程序来解析 symbol。该功能对于添包含不会链接到程序的库对象非常有用。
用该选项指定符号将通过 /OPT:REF 重写该符号的移除。
==============================================================
/LIBPATH(附加的 Libpath)
/LIBPATH:dir
其中:
dir
在链接器搜索 LIB 环境选项中指定的路径之前,指定它将要搜索的路径。
备注
使用 /LIBPATH 选项重写环境库路径。链接器将首先在该选项所指定的路径中搜索,然后在 LIB 环境变量中所指定的路径中搜索。对于您输入的每 个 /LIBPATH 选项,只能指定一个目录。如果要指定一个以上的目录,则必须指定多个 /LIBPATH 选项。链接器然后将按顺序搜索指定的目 录。
==============================================================
/MACHINE(指定目标平台)
/MACHINE:{ARM|EBC|IA64|MIPS|MIPS16|MIPSFPU|MIPSFPU16| SH4|THUMB|X64|X86}
备注
/MACHINE 选项指定程序的目标平台。
通常情况下,不需要指定 /MACHINE 选项。LINK 从 .obj 文件中推断出计算机类型。但在某些情况下,LINK 无法确定计算机类型并发出链接器工具错误 LNK1113。如果发生了此类错误,请指定 /MACHINE。
==============================================================
/MAP(生成映射文件)
/MAP[:filename]
其中:
filename
用户指定的映射文件名称。它将替换默认名称。
备注
/MAP 选项通知链接器创建映射文件。
默认情况下,链接器用程序的基名称和扩展名 .map 命名映射文件。可选的 filename 使您得以重写映射文件的默认名称。
映射文件是一个文本文件,包含有关被链接程序的下列信息:
模块名称,为文件的基名称
时间戳,来自程序文件头(不是来自文件系统)
程序中的组列表,包括每个组的起始地址(节:偏移量的形式)、长度、组名和类
公共符号的列表,包括每个地址(节:偏移量的形式)、符号名称、平直地址和包含符号定义的 .obj 文件
入口点(节:偏移量的形式)
/MAPINFO 选项指定要包括在映射文件中的附加信息。
==============================================================
/MAPINFO(包含映射文件中的信息)
/MAPINFO:EXPORTS
备注
/MAPINFO 选项通知链接器包含映射文件中指定的信息,如果指定 /MAP 选项,则创建该映射文件。EXPORTS 通知链接器包含导出函数。
==============================================================
/MERGE(合并节)
/MERGE:from=to
/MERGE 选项将第一个节 (from) 和第二个节 (to) 合并在一起,将结果节命名为 to。例如 /merge:.rdata=.text。
如果第二个节不存在,则 LINK 将节 from 重命名为 to。
/MERGE 选项对于创建 VxD 和重写编译器生成的节名非常有用。
==============================================================
/NODEFAULTLIB(忽略库)
/NODEFAULTLIB[:library]
其中:
library
当链接器解析外部引用时使链接器忽略的库。
备注
/NODEFAULTLIB 选项通知链接器将一个或多个默认库从链接器解析外部引用时所搜索的库列表中移除。
要创建一个不包含默认库引用的 .obj 文件,请使用 /Zl(省略默认库名)。
默认情况下,/NODEFAULTLIB 从它解析外部引用时所搜索的库列表中移除所有默认库。可选 library 参数使您得以将指定的库从它解析外部引用时所搜索的库列表中移除。为每个要排除的库指定一个 /NODEFAULTLIB 选项。
链接器解析外部定义的引用时,首先通过在您显式指定的库中搜索,然后在用 /DEFAULTLIB 选项指定的默认库中搜索,最后在 .obj 文件中命名的默认库中搜索。
/NODEFAULTLIB:library 重写 /DEFAULTLIB:library(如果在这两者中指定相同的 library 名称)。
例如,如果在没有 C 运行时库情况下使用 /NODEFAULTLIB 生成程序,可能还需要使用 /ENTRY 指定程序中的入口点(函数)。有关更多信息,请参见 C Run-Time Libraries。
==============================================================
/NOENTRY(无入口点)
/NOENTRY
备注
创建纯资源 DLL 时要求 /NOENTRY 选项。
==============================================================
/NOLOGO(取消显示启动版权标志)(链接器)
/NOLOGO
备注
/NOLOGO 选项防止显示版权消息和版本号。
该选项还取消命令文件的回显。有关详细信息,请参见 LINK 命令文件。
默认情况下,该信息由链接器发送到“输出”窗口。在命令行上,它被发送到标准输出并可以重定向到文件。
==============================================================
/OPT(优化)
控制 LINK 在生成期间执行的优化。
/OPT:{REF | NOREF}
/OPT:{ICF[=iterations] | NOICF}
/OPT:{WIN98 | NOWIN98}
参数
REF | NOREF
/OPT:REF 清除从未引用的函数和/或数据,而 /OPT:NOREF 保留从未引用的函数和/或数据。
默认情况下,LINK 移除未引用的封装函数。如果对象已经用 /Gy 选项编译过,它包含封装函数 (COMDAT)。此优化称为可传递的 COMDAT 消除。若要重写该默认值并在程序中保留未引用的 COMDAT,请指定 /OPT:NOREF。可以使用 /INCLUDE 选项重写特 定符号的移除。
如果指定了 /DEBUG,/OPT 的默认项是 NOREF(否则,为 REF),而且所有函数都保留在映像中。若要重写此默认项并优化调试生成,请指定 /OPT:REF。/OPT:REF 选项禁用增量链接。
必须显式地将数据标记为 COMDAT;使用 __declspec(selectany)。
如果指定了 /OPT:REF,默认情况下 /OPT:ICF 处于打开状态。如果需要 /OPT:REF 而不是 /OPT:ICF,则必须指定下面的内容:
link /opt:ref /opt:noicf
指定 /OPT:ICF 不激活 /OPT:REF 选项。
ICF[= iterations ] | NOICF
使用 /OPT:ICF[=iterations] 执行相同的 COMDAT 折叠。可以从链接器输出中移除多余的 COMDAT。 iteration 指定遍历符号以查找重复项的次数。默认迭代次数是两次。附加的迭代可以找到前一次迭代中通过折叠未发现的重复项。
请 注意,默认情况下 ICF 有效时(显式指定 /OPT:REF),与显式指定 /OPT:REF,ICF 时,链接器行为是有区别的。默认的带 /OPT:REF 的 ICF 不折叠只读数据。这包括任何 .rdata、.pdata 和 .xdata。但是,默认的带 /OPT:REF 的 ICF 导致在为 Itanium 和 x64 生成映像时折叠较少的函数,因为这些模块中的函数具有更多的只读数据依赖项,例如 .pdata 和 .xdata。若要获得完整的 ICF,请显式指定 /OPT:ICF。
函数通过 /Gy 编译器选项放在 COMDAT 中,常数数据放在 COMDAT 中。有关如何为折叠指定数据的示例,请参见 selectany。
如果 REF 处于打开状态并且需要在调试生成中显式打开,则默认情况下 ICF 处于打开状态。如果指定了 REF,则可以指定 NOICF。
注意
/OPT:ICF 可导致相同的地址分配到不同的函数或只读数据成员(用 /Gy 编译的常数变量)。因此,/OPT:ICF 可中断依赖于不同的函数或只读数据成员的地址的程序。有关更多信息,请参见 /Gy(启用函数级链接)。
WIN98 | NOWIN98
WIN98 和 NOWIN98 控制最终映像中的节对齐。对于 Windows 98 应用程序,最好是在 4K 的边界上对齐节,以改进加载时间(允许 Windows 98 内存管理器缓存可执行图像同时最少化浪费的空间)。默认情况下,此选项在链接器中是打开的,因此需要指定 /OPT: NOWIN98 以获得精简(但在 Windows 98 上较慢)的应用程序版本。
默认情况下,WIN98 处于打开状态。WIN98 在下列情况下是关闭的:
使用了 /ALIGN。
/MACHINE 的目标不是 x86。
/SUBSYSTEM 指定 WINDOWS 或 CONSOLE 以外的内容。
备注
优化通常是以增加链接时间为代价,减小图像大小并加快程序速度。
可使用 /VERBOSE 选项查看由 /OPT:REF 移除的函数和由 /OPT:ICF 折叠的函数。
==============================================================
/ORDER(按顺序放置函数)
/ORDER:@filename
参数
filename
指定 COMDAT 函数链接顺序的文本文件。
备注
/ORDER 选项通知 LINK 按预先确定的顺序将特定的 COMDAT 放置到图像中以优化程序。LINK 按指定的顺序在图像的每个节中放置函数。
在 filename 中指定顺序。filename 是按照您希望链接 COMDAT 的顺序列出 COMDAT 的文本文件(响应文件)。 filename 中的每一行包含一个 COMDAT 的名称。如果对象已经用 /Gy 选项编译过,它包含 COMDAT。函数名区分大小写。
LINK 使用标识符的修饰形式。编译器在创建 .obj 文件时修饰标识符。当需要将标识符的修饰形式指定给链接器时,可使用 DUMPBIN 工具获取它。有关修饰名的更多信息,请参见修饰名。
如果使用了多个 /ORDER 规范,指定的最后一个规范有效。
排序允许将一个函数与该函数调用的函数组合,通过交换优化来优化程序的分页行为。还可将经常调用的函数分在一组。这些技术增加了调用的函数在需要它时位于内存中从而不必从磁盘分页的可能性。
链接器在 filename 中的每个修饰名前放置一个下划线 (_),只要名称不是以问号 (?) 或 at 符 (@) 开头。例如,如果对象文件包 含 extern "C" int func(int) 和 int main(void),则 DUMPBIN /SYMBOLS 将列出这些修饰名:
009 00000000 SECT3 notype () External | _func
00A 00000008 SECT3 notype () External | _main
不过,在顺序文件中指定的名称应为 func 和 main。
/ORDER 选项禁用增量链接。
注意
LINK 无法对静态函数进行排序,因为静态函数名不是公共符号名。如果指定了 /ORDER,在顺序文件中将为每个静态的或者没有找到的符号生成链接器警告 LNK4037。
==============================================================
/OUT(输出文件名)
/OUT:filename
其中:
filename
用户指定的输出文件名。它将替换默认名称。
备注
/OUT 选项重写链接器创建的程序的默认名称和位置。
默认情况下,链接器用指定的第一个 .obj 文件的基名称和适当的扩展名(.exe 或 .dll)来组成文件名。
该选项设置 .mapfile 或导入库的默认基名称。有关详细信息,请参见生成映射文件 (/MAP) 和 /IMPLIB。
==============================================================
/RELEASE(设置校验和)
/RELEASE
备注
/RELEASE 选项在 .exe 文件头中设置校验和。
操作系统要求设备驱动程序的校验和。为设备驱动程序的发布版本设置校验和,以确保与未来的操作系统兼容。
当指定 /SUBSYSTEM:NATIVE 选项时,默认情况下设置 /RELEASE 选项。
==============================================================
/SECTION(指定节属性)
/SECTION:name,[[!]{DEKPRSW}][,ALIGN=#]
备注
/SECTION 选项更改节的属性,当节的 .obj 文件被编译时重写属性集。
可移植可执行 (PE) 文件中的节大致等效于新的可执行 (NE) 文件中的段或资源。节包含代码或数据。与段不同,节是连续内存的块,没有大小限制。 有些节包含程序声明和直接使用的代码或数据,而有些数据节是由链接器和库管理器 (lib.exe) 创建的,包含了对操作系统来说至关重要的信息。有关 NE 文件的更多信息,请参见知识库文章“Executable-File Header Format”(Q65122)。可以在 MSDN Library 中或 http://support.microsoft.com/default.aspx?ln=zh-cn 上找到知识库文章。
指定冒号 (:) 和节 name。name 区分大小写。
不要使用以下名称,因为它们与标准名称冲突。例如,.sdata 用在 RISC 平台上:
.arch
.bss
.data
.edata
.idata
.pdata
.rdata
.reloc
.rsrc
.sbss
.sdata
.srdata
.text
.xdata
为节指定一个或多个属性。以下列出的属性字符不区分大小写。必须指定您希望节具有的所有属性;省略的属性字符将导致该属性位被关闭。如果不指定 R、W 或 E,则现有的读、写或可执行状态保持不变。
若要取反属性,请在属性字符前使用一个感叹号 (!)。属性字符的含义如下所示:
字符 属性 含义
E Execute 节是可执行的
R Read 允许对数据进行读取操作
W Write 允许对数据进行写操作
S Shared 在所有加载图像的进程中共享节
D Discardable 将节标记为可放弃
K Cacheable 将节标记为不可缓存
P Pageable 将节标记为不可分页
K 和 P 比较特殊,因为与其对应的节标志表示相反的含义。如果在 .text 节 (/SECTION:.text,K) 上指定它们之中的一个,当运行 带 /HEADERS 选项 Dumpbin 时在节标志中将没有区别;它已被隐式缓存了。若要移除默认值,请指定 /SECTION:.text,! K,DUMPBIN 将显示节特性,包括“未缓存。”。
没有设置 E、R 或 W 的 PE 文件中的节可能无效。
ALIGN=# 使您得以为特定的节指定对齐值。有关更多信息,请参见 /ALIGN。
==============================================================
/STACK(堆栈分配)
/STACK:reserve[,commit]
备注
/STACK 选项设置堆栈的大小(以字节为单位)。此选项仅在生成 .exe 文件时使用。
该选项指定虚拟内存中的总的堆栈分配。默认堆栈大小为 1 MB。链接器将指定值向上舍入为最接近的 4 个字节。
commit 取决于操作系统所作的解释。在 Windows NT 和 Windows 2000 中,它指定一次分配的物理内存量。提交的虚拟内存导致空间被保留在 页面文件中。更高的 commit 值在应用程序需要更多堆栈空间时可节省时间,但会增加内存需求并有可能延长启动时间。
以十进制或 C 语言表示法指定 reserve 值和 commit 值。
设置堆栈大小的另一种方法是使用模块定义 (.def) 文件中的 STACKSIZE 语句。如果两者都指定,则 STACKSIZE 重写堆栈分配 (/STACK) 选项。可以使用 EDITBIN 工具在生成 .exe 文件之后更改堆栈。
==============================================================
/STUB(MS-DOS 存根 (stub) 文件名)
/STUB:filename
其中:
filename
MS-DOS 应用程序。
备注
/STUB 选项将 MS-DOS 存根 (stub) 程序附加到 Win32 程序。
如果在 MS-DOS 中执行文件,则将调用存根 (stub) 程序。它通常显示适当的消息;然而,任何有效的 MS-DOS 应用程序都可以是存根 (stub) 程序。
在命令行上冒号 (:) 之后,为存根 (stub) 程序指定 filename。如果文件不是可执行文件,则链接器检查 filename 并发出错误信息。程序必须是 .exe 文件;.com 文件对于存根 (stub) 程序无效。
如果不使用该选项,则链接器附加发出以下消息的默认存根 (stub) 程序:
This program cannot be run in MS-DOS mode.
当生成虚拟设备驱动程序时,filename 使用户得以指定文件名,该文件名包含要用于 VXD 中而不是默认头的 IMAGE_DOS_HEADER 结构(在 WINNT.H 中定义)。
==============================================================
/SUBSYSTEM(指定子系统)
/SUBSYSTEM:{CONSOLE|EFI_APPLICATION|EFI_BOOT_SERVICE_DRIVER|
EFI_ROM|EFI_RUNTIME_DRIVER|NATIVE|POSIX|WINDOWS|WINDOWSCE}
[,major[.minor]]
备注
其中:
CONSOLE
Win32 字符模式应用程序。控制台应用程序是操作系统提供的控制台。如果定义 main 或 wmain,则 CONSOLE 为默认值。
可扩展固件接口
EFI_* 子系统。有关更多信息,请参见 EFI 规范。有关示例,请参见 Intel 网站。最低和默认版本为 1.0。
NATIVE
Windows NT 的设备驱动程序。如果指定 /DRIVER:WDM,则 NATIVE 为默认值。
POSIX
在 Windows NT 中与 POSIX 子系统运行的应用程序。
WINDOWS
应用程序并不需要控制台,因为它可以创建自己的用户交互窗口。如果定义 WinMain 或 wWinMain,则 WINDOWS 为默认值。
WINDOWSCE
在 Windows CE 设备上运行的应用程序。
major 和 minor(可选)
指定子系统的要求的最低版本。参数为 0 到 65,535 之间的十进制数。有关详细信息,请参见“备注”。版本号没有上限。
备注
/SUBSYSTEM 选项通知操作系统如何运行 .exe 文件。
==============================================================
/VERSION(版本信息)
/VERSION:major[.minor]
其中:
major 和 minor
希望 .exe 或 .dll 文件头中包含的版本号。
备注
/VERSION 选项通知链接器将版本号放置在 .exe 或 .dll 文件头中。使用 DUMPBIN /HEADERS 查看 OPTIONAL HEADER VALUES 的图像版本字段,以查看 /VERSION 的效果。
major 和 minor 参数是从 0 到 65,535 的范围内的十进制数。默认值为 0.0 版。
用 /VERSION 指定的信息不影响在 Windows 资源管理器中查看应用程序属性时所显示的应用程序的版本信息。该版本信息来自用于生成应用程序的资源文件。有关更多信息,请参见版本信息编辑器。
另一种插入版本号的方法是用 VERSION 模块定义语句。
==============================================================
/VERBOSE(打印进度消息)
/VERBOSE[:ICF |:LIB |:REF |:SAFESEH]
备注
链接器将有关链接会话进度的信息发送到“输出”窗口。在命令行上,信息被发送到标准输出,并可以重定向到文件。
选项 说明
/VERBOSE
显示有关链接进度的详细信息。
/VERBOSE:ICF
显示关于从使用 /OPT:ICF 中产生的链接器活动的信息。
/VERBOSE:LIB
显示进度消息,仅指示所搜索的库。
所显示的信息包括库搜索进程,同时还列出每个库和对象名(包括完整路径),正从库中解析的符号,以及引用该符号的对象的列表。
/VERBOSE:REF
显示关于从使用 /OPT:REF 中产生的链接器活动的信息。
/VERBOSE:SAFESEH
显示与在未指定 /SAFESEH 时哪些模块与安全异常处理不兼容的有关信息。
==============================================================
/WX(将链接器警告视为错误)
/WX[:NO]
备注
如果链接器生成警告,/WX 将不会生成任何输出文件。
这与编译器的 /WX 类似(有关更多信息,请参见 /w、/Wn、/WX、/Wall、/wln、/wdn、/wen、/won(警告等级))。但是,为编译指定 /WX 并不意味着 /WX 在链接阶段同样有效;必须为每种工具都显式指定 /WX。
默认情况下,/WX 不起作用。若要将链接器警告视为错误,请指定 /WX。/WX:NO 等同于不指定 /WX。
编译器中的#pragma相关的几个特殊选项的使用
编写应用程序的时候最常用的写法是在自己的DLL或者.exe文件中使用如下的编译器命令来达到将已经编译好的.lib或者.DLL(静态方式加载)中的symbol的地址告诉linker以便在生成DLL/.exe的时候可以找得到。
命令:
#pragma(lib, "xxx.lib")
以上命令的基本原理再次不去详述,有兴趣的可以研究一下编译原理
然而还有很多的更为强大的功能,虽然不是很常用,但是“书到用时方恨少”,他可以轻松帮助我们解决一些十分棘手的问题。
下面列举一例:
我的一个项目有很多的lib构成,其中许多的lib之间是一种依赖关系,诸如my_project= lib A + lib B + lib C;而A = lib B + lib C;然而B和C中有许多的全局函数和变量以及class等,这些虽然在A中没有直接使用,但是my_project却使用了。但是linker有一个“毛病”(其实是linker为了缩减不必要的开销):对于linker,在生成A的过程中如果在B和C中存在没有使用的全局的symbol(全局的函数,变量,class等),则不将他们linker进A,这就是说我们的希望破灭了!但是编译器并没有把解决问题的钥匙给扔到九霄云外!将以下的命令放在A的.c/.cpp中则可以将指定的symbollink进A的binary!
#pragma(linker, "/include:?var_name@")
其中var_name是你希望link进A的symbol的名字!
至于以上命令的工作原理同样不在这里叙述!
命令:
#pragma(lib, "xxx.lib")
以上命令的基本原理再次不去详述,有兴趣的可以研究一下编译原理
然而还有很多的更为强大的功能,虽然不是很常用,但是“书到用时方恨少”,他可以轻松帮助我们解决一些十分棘手的问题。
下面列举一例:
我的一个项目有很多的lib构成,其中许多的lib之间是一种依赖关系,诸如my_project= lib A + lib B + lib C;而A = lib B + lib C;然而B和C中有许多的全局函数和变量以及class等,这些虽然在A中没有直接使用,但是my_project却使用了。但是linker有一个“毛病”(其实是linker为了缩减不必要的开销):对于linker,在生成A的过程中如果在B和C中存在没有使用的全局的symbol(全局的函数,变量,class等),则不将他们linker进A,这就是说我们的希望破灭了!但是编译器并没有把解决问题的钥匙给扔到九霄云外!将以下的命令放在A的.c/.cpp中则可以将指定的symbollink进A的binary!
#pragma(linker, "/include:?var_name@")
其中var_name是你希望link进A的symbol的名字!
至于以上命令的工作原理同样不在这里叙述!