编译器选项
将msdn上vs2013的编译器选项记载一下,我不创造文章,我只是大自然的搬运工:
1./STACK(堆栈分配)
/STACK:reserve[,commit]
/STACK 选项设置堆栈的大小(以字节为单位)。此选项仅在生成 .exe 文件时使用。
该选项指定虚拟内存中的总的堆栈分配。默认堆栈大小为 1 MB。链接器将指定值向上舍入为最接近的 4 个字节。
commit 取决于操作系统所作的解释。在 Windows NT 和 Windows 2000 中,它指定一次分配的物理内存量。提交的虚拟内存导致空间被保留在页面文件中。更高的 commit 值在应用程序需要更多堆栈空间时可节省时间,但会增加内存需求并有可能延长启动时间。
以十进制或 C 语言表示法指定 reserve 值和 commit 值。
设置堆栈大小的另一种方法是使用模块定义 (.def) 文件中的 STACKSIZE 语句。如果两者都指定,则 STACKSIZE 重写堆栈分配 (/STACK) 选项。可以使用 EDITBIN 工具在生成 .exe 文件之后更改堆栈。
在 Visual Studio 开发环境中设置此链接器选项
-
打开此项目的“属性页”对话框。有关详细信息,请参见设置 Visual C++ 项目属性。
-
单击“链接器”文件夹。
-
单击“系统”属性页。
-
修改下列任一属性:
-
堆栈提交大小
- 堆栈保留大小
-
2./WX(将链接器警告视为错误)
/WX[:NO]
/WX 指示在链接器生成警告的情况下不生成任何输出文件。
这与编译器的 /WX 类似(有关更多信息,请参见 /w、/Wn、/WX、/Wall、/wln、/wdn、/wen、/won(警告等级))。 但是,为编译指定 /WX 并不意味着 /WX 在链接阶段同样有效;必须为每种工具都显式指定 /WX。
默认情况下,/WX 不起作用。 若要将链接器警告视为错误,请指定 /WX。 /WX:NO 等同于不指定 /WX。
在 Visual Studio 开发环境中设置此链接器选项
-
打开项目的“属性页”对话框。 有关详细信息,请参见设置 Visual C++ 项目属性。
-
单击“链接器”文件夹。
-
单击“命令行”属性页。
-
将该选项键入“附加选项”框中。
3./HEAP(设置堆大小)
/HEAP:reserve[,commit]
/HEAP 选项设置堆的大小(以字节为单位)。 此选项仅在生成 .exe 文件时使用。
reserve 参数指定虚拟内存中总的堆分配。 默认堆大小为 1 MB。 链接器将指定值向上舍入为最接近的 4 个字节。
可选 commit 参数取决于操作系统的解释。 在 Windows NT/Windows 2000 中,它指定一次分配的物理内存的数量。 提交的虚拟内存导致空间被保留在页面文件中。 更高的 commit 值在应用程序需要更多堆空间时可节省时间,但会增加内存需求并有可能延长启动时间。
以十进制或 C 语言表示法指定 reserve 值和 commit 值。
通过带 HEAPSIZE 的模块定义文件也可以实现该功能。
在 Visual Studio 开发环境中设置此链接器选项
-
打开项目的“属性页”对话框。 有关详细信息,请参见设置 Visual C++ 项目属性。
-
单击“链接器”文件夹。
-
单击“系统”属性页。
-
修改“堆提交大小”属性。
见图1
4./FORCE(强制文件输出)
/FORCE:[MULTIPLE|UNRESOLVED]
即使引用了符号但未定义或多次定义符号,/FORCE 选项也通知链接器创建有效的 .exe 文件或 DLL。
/FORCE 选项可以带一个可选参数:
-
使用 /FORCE:MULTIPLE 可创建输出文件,而不管 LINK 是否找到了符号的多个定义。
-
使用 /FORCE:UNRESOLVED 可创建输出文件,而不管 LINK 是否找到未定义的符号。如果未解析入口点符号,则将忽略 /FORCE:UNRESOLVED。
不带参数的 /FORCE 表示多次定义和未解析。
用该选项创建的文件可能不会按预期运行。 当指定 /FORCE 选项时,链接器将不增量链接。
如果使用 /clr 编译模块,则 /FORCE 将不会创建映像。
在 Visual Studio 开发环境中设置此链接器选项
-
打开项目的“属性页”对话框。 有关详细信息,请参见设置 Visual C++ 项目属性。
-
单击“链接器”文件夹。
-
单击“命令行”属性页。
-
将该选项键入“附加选项”框中。
5./FIXED(固定基址)
/FIXED[:NO]
通知操作系统只在其首选基址加载程序。 如果首选基址不可用,则操作系统将不加载该文件。 有关详细信息,请参阅/BASE(基址)。
/FIXED:NO 是DLL 的默认设置,/FIXED 是任何其他项目类型的默认设置。
当指定 /FIXED 时,LINK 不生成程序中的重定位节。 在运行时,如果操作系统无法在指定的地址加载程序,它将发出错误信息并且不加载该程序。
指定 /FIXED:NO 以在程序中生成重定位节。
在 Visual Studio 开发环境中设置此链接器选项
-
打开项目的“属性页”对话框。 有关详细信息,请参见使用项目属性。
-
选择 Linker 文件夹。
-
选择“命令行”属性页。
-
键入选项名并在 “其他选项” 框中设置。
报错原因看下面
6./DYNAMICBASE(使用地址空间布局随机化功能)
/DYNAMICBASE[:NO]
默认情况下,/DYNAMICBASE 处于打开状态。
此选项修改可执行文件头,以指示是否应在加载时对应用程序随机重新设定基址。
Windows Vista 支持地址空间布局随机化功能。
在 Visual Studio 中设置此链接器选项
-
打开此项目的“属性页”对话框。 有关更多信息,请参看如何:打开项目属性页。
-
展开“配置属性”节点。
-
展开“链接器”节点。
-
选择“高级”属性页。
-
修改“随机基址”属性。
7./DEF(指定模块定义文件)
/DEF:filename
/DEF 选项将模块定义文件(.def)传递到链接器。 只能为 LINK 指定一个 .def 文件。 有关 .def 文件的详细信息,请参见模块定义文件。
在 Visual Studio 开发环境中设置此链接器选项
-
打开项目的“属性页”对话框。 有关详细信息,请参见设置 Visual C++ 项目属性。
-
单击“链接器”文件夹。
-
单击“输入”属性页。
-
修改“模块定义文件”属性。
若要从开发环境内指定 .def 文件,应将它连同其他文件一起添加到项目,然后将该文件指定给 /DEF 选项。
模块定义 (.def) 文件为链接器提供有关被链接程序的导出、特性及其他方面的信息。 生成 DLL 时,.def 文件最有用。 由于存在可代替模块定义语句使用的链接器选项,通常不需要 .def 文件。 也可以将 __declspec(dllexport) 用作指定导出函数的手段。
在链接器阶段可以使用 /DEF(指定模块定义文件)链接器选项调用 .def 文件。
如果生成的 .exe 文件没有导出,使用 .def 文件将使输出文件较大并降低加载速度。
有关示例,请参见使用 DEF 文件从 DLL 导出 。
.def 这里不详述了。。。
8./DEBUG(生成调试信息)
/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)。
有关 .PDB 和 .DBG 文件的更多信息,请参见知识库文章 Q121366,INFO: PDB and DBG Files - What They Are and How They Work。 可在 MSDN 库 或 http://search.support.microsoft.com 上找到知识库文章。
无法创建包含调试信息的 .exe 或 .dll。 调试信息始终放在 .pdb 文件中。
在 Visual Studio 开发环境中设置此链接器选项
-
打开项目的“属性页”对话框。 有关详细信息,请参见设置 Visual C++ 项目属性。
-
单击“链接器”文件夹。
-
单击“调试”属性页。
-
修改“生成调试信息”属性。
9./OPT(优化)
/OPT:{REF | NOREF} /OPT:{ICF[=iterations] | NOICF} /OPT:{LBR | NOLBR}
10./ALLOWBIND(禁止 DLL 绑定)
/ALLOWBIND[:NO]
/ALLOWBIND:NO 在 DLL 的标头中设置一个位,向 Bind.exe 指示不允许绑定图像。 如果 DLL 已经进行数字签名(绑定使签名无效),可能不需要绑定 DLL。
可以使用 EDITBIN 实用工具的 /ALLOWBIND 选项编辑 /ALLOWBIND 功能的现有 DLL。
在 Visual Studio 开发环境中设置此链接器选项
番外:
1./DELAYSIGN(为程序集进行部分签名)
/DELAYSIGN[:NO]
如果只想将公钥放入程序集中,则应使用 /DELAYSIGN。 默认值为 /DELAYSIGN:NO。
如果不与 /KEYFILE 或 /KEYCONTAINER 一起使用,则 /DELAYSIGN 选项没有任何作用。
如果要求完全签名的程序集,编译器将对包含清单(程序集元数据)的文件进行散列处理,并用私钥对该散列数据进行签名。 产生的数字签名存储在包含清单的文件中。 如果程序集的签名延迟,则链接器将不会计算和存储签名,但会在文件中保留空间以便以后添加签名。
例如,使用 /DELAYSIGN 将允许测试人员把程序集放入全局缓存中。 测试完成后,可以通过将私钥放入程序集中对程序集进行完全签名。
有关对程序集签名的更多信息,请参见 强名称程序集(程序集签名)(C++/CLI) 和 延迟为程序集签名。
其他影响程序集生成的链接器选项为:
在 Visual Studio 开发环境中设置此链接器选项
-
打开项目的“属性页”对话框。 有关详细信息,请参见设置 Visual C++ 项目属性。
-
单击“链接器”文件夹。
-
单击“命令行”属性页。
-
将该选项键入“附加选项”框中。
涉及更多知识点,先押后待续。。。。。
2./DELAYLOAD(延迟加载导入)
/DELAYLOAD:dllname
/DELAYLOAD 选项导致 dllname 指定的 DLL 只能在程序第一次调用该 DLL 中的函数时加载。 有关详细信息,请参阅 链接器的延迟加载 DLL 支持。 你可以根据需要多次使用此选项,以便指定已选的多个 DLL。 当链接你的程序时,你必须使用 Delayimp.lib,或者也可以实现你自己的延迟加载 Helper 函数。
/DELAY 选项为每个延迟加载的 DLL 指定绑定和加载选项。
在 Visual Studio 开发环境中设置此链接器选项
-
打开项目的“属性页”对话框。 有关详细信息,请参阅 使用项目属性。
-
在“链接器”文件夹中,选择“输入”属性页。
-
修改“延迟加载的 DLL”属性。
涉及更多知识点,先押后待续。。。。。
3./DELAY(延迟加载导入设置)
/DELAY:UNLOAD /DELAY:NOBIND
/DELAY 选项控制 DLL 的延迟加载:
-
UNLOAD 限定符通知延迟加载 Helper 函数支持 DLL 的显式卸载。 导入地址表 (IAT) 被重置为其原始形式,从而使 IAT 指针无效并导致它们被覆盖。
如果不选择 UNLOAD,任何对 FUnloadDelayLoadedDLL 调用都将失败。
-
NOBIND 限定符通知链接器不要在最终图像中包含可绑定的 IAT。 默认值是为延迟加载的 DLL 创建可绑定的 IAT。 无法静态绑定生成的图像。 (可以在执行之前静态绑定包含可绑定 IAT 的图像。)请参阅 /BIND。
如果绑定了 DLL,则 Helper 函数将尝试使用绑定信息,而不是对每个引用的导入调用 GetProcAddress。 如果时间戳或首选地址与加载的 DLL 的时间戳或首选地址不匹配,则 Helper 函数将假定绑定的 IAT 已经过期并继续执行,就像绑定的 IAT 不存在一样。
NOBIND 导致程序图像比较大,但是可以加快 DLL 的加载时间。 如果从不打算绑定 DLL,则 NOBIND 将禁止生成绑定的 IAT。
若要指定 DLL 延迟加载,请使用 /DELAYLOAD 选项。
在 Visual Studio 开发环境中设置此链接器选项
-
打开项目的“属性页”对话框。 有关信息,请参见使用项目属性。
-
依次展开“配置属性”、“链接器”,然后选择“高级”。
-
修改“延迟加载的 DLL”属性。