编译器选项

将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 开发环境中设置此链接器选项

  1. 打开此项目的“属性页”对话框。有关详细信息,请参见设置 Visual C++ 项目属性
  2. 单击“链接器”文件夹。
  3. 单击“系统”属性页。
  4. 修改下列任一属性:
    • 堆栈提交大小
    • 堆栈保留大小

2./WX(将链接器警告视为错误)

/WX[:NO]

/WX 指示在链接器生成警告的情况下不生成任何输出文件。

这与编译器的 /WX 类似(有关更多信息,请参见 /w、/Wn、/WX、/Wall、/wln、/wdn、/wen、/won(警告等级))。 但是,为编译指定 /WX 并不意味着 /WX 在链接阶段同样有效;必须为每种工具都显式指定 /WX

默认情况下,/WX 不起作用。 若要将链接器警告视为错误,请指定 /WX/WX:NO 等同于不指定 /WX

在 Visual Studio 开发环境中设置此链接器选项

  1. 打开项目的“属性页”对话框。 有关详细信息,请参见设置 Visual C++ 项目属性
  2. 单击“链接器”文件夹。
  3. 单击“命令行”属性页。
  4. 将该选项键入“附加选项”框中。

3./HEAP(设置堆大小)

/HEAP:reserve[,commit]

/HEAP 选项设置堆的大小(以字节为单位)。 此选项仅在生成 .exe 文件时使用。

reserve 参数指定虚拟内存中总的堆分配。 默认堆大小为 1 MB。 链接器将指定值向上舍入为最接近的 4 个字节。

可选 commit 参数取决于操作系统的解释。 在 Windows NT/Windows 2000 中,它指定一次分配的物理内存的数量。 提交的虚拟内存导致空间被保留在页面文件中。 更高的 commit 值在应用程序需要更多堆空间时可节省时间,但会增加内存需求并有可能延长启动时间。

以十进制或 C 语言表示法指定 reserve 值和 commit 值。

通过带 HEAPSIZE 的模块定义文件也可以实现该功能。

在 Visual Studio 开发环境中设置此链接器选项

  1. 打开项目的“属性页”对话框。 有关详细信息,请参见设置 Visual C++ 项目属性
  2. 单击“链接器”文件夹。
  3. 单击“系统”属性页。
  4. 修改“堆提交大小”属性。

见图1

4./FORCE(强制文件输出)

/FORCE:[MULTIPLE|UNRESOLVED]

即使引用了符号但未定义或多次定义符号,/FORCE 选项也通知链接器创建有效的 .exe 文件或 DLL。

/FORCE 选项可以带一个可选参数:

  • 使用 /FORCE:MULTIPLE 可创建输出文件,而不管 LINK 是否找到了符号的多个定义。
  • 使用 /FORCE:UNRESOLVED 可创建输出文件,而不管 LINK 是否找到未定义的符号。如果未解析入口点符号,则将忽略 /FORCE:UNRESOLVED。

不带参数的 /FORCE 表示多次定义和未解析。

用该选项创建的文件可能不会按预期运行。 当指定 /FORCE 选项时,链接器将不增量链接。

如果使用 /clr 编译模块,则 /FORCE 将不会创建映像。

在 Visual Studio 开发环境中设置此链接器选项

  1. 打开项目的“属性页”对话框。 有关详细信息,请参见设置 Visual C++ 项目属性
  2. 单击“链接器”文件夹。
  3. 单击“命令行”属性页。
  4. 将该选项键入“附加选项”框中。


5./FIXED(固定基址)

/FIXED[:NO]

通知操作系统只在其首选基址加载程序。 如果首选基址不可用,则操作系统将不加载该文件。 有关详细信息,请参阅/BASE(基址)

/FIXED:NO 是DLL 的默认设置,/FIXED 是任何其他项目类型的默认设置。

当指定 /FIXED 时,LINK 不生成程序中的重定位节。 在运行时,如果操作系统无法在指定的地址加载程序,它将发出错误信息并且不加载该程序。

指定 /FIXED:NO 以在程序中生成重定位节。

在 Visual Studio 开发环境中设置此链接器选项

  1. 打开项目的“属性页”对话框。 有关详细信息,请参见使用项目属性
  2. 选择 Linker 文件夹。
  3. 选择“命令行”属性页。
  4. 键入选项名并在 “其他选项” 框中设置。

报错原因看下面

6./DYNAMICBASE(使用地址空间布局随机化功能)

/DYNAMICBASE[:NO]

默认情况下,/DYNAMICBASE 处于打开状态。

此选项修改可执行文件头,以指示是否应在加载时对应用程序随机重新设定基址。

Windows Vista 支持地址空间布局随机化功能。

在 Visual Studio 中设置此链接器选项

  1. 打开此项目的“属性页”对话框。 有关更多信息,请参看如何:打开项目属性页
  2. 展开“配置属性”节点。
  3. 展开“链接器”节点。
  4. 选择“高级”属性页。
  5. 修改“随机基址”属性。

7./DEF(指定模块定义文件)

/DEF:filename
filename

要传递到链接器的模块定义文件 (.def) 的名称。

/DEF 选项将模块定义文件(.def)传递到链接器。 只能为 LINK 指定一个 .def 文件。 有关 .def 文件的详细信息,请参见模块定义文件

在 Visual Studio 开发环境中设置此链接器选项

  1. 打开项目的“属性页”对话框。 有关详细信息,请参见设置 Visual C++ 项目属性
  2. 单击“链接器”文件夹。
  3. 单击“输入”属性页。
  4. 修改“模块定义文件”属性。

若要从开发环境内指定 .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 开发环境中设置此链接器选项

  1. 打开项目的“属性页”对话框。 有关详细信息,请参见设置 Visual C++ 项目属性
  2. 单击“链接器”文件夹。
  3. 单击“调试”属性页。
  4. 修改“生成调试信息”属性。

9./OPT(优化)

/OPT:{REF | NOREF}
/OPT:{ICF[=iterations] | NOICF}
/OPT:{LBR | NOLBR}

参数:

REF | NOREF

/OPT:REF 清除从未引用的函数和数据;/OPT:NOREF 保留从未引用的函数和数据。

当启用 /OFT:REF 时,LINK 会移除未引用的已打包函数和数据。 如果对象已经用 /Gy 选项编译过,它将包含打包的函数和数据 (COMDAT)。 此优化称为可传递的 COMDAT 消除。 默认情况下,在非调试生成中启用 /OPT:REF。 若要重写此默认值并在程序中保留未引用的 COMDAT,请指定 /OPT:NOREF。 可以使用 /INCLUDE 选项重写特定符号的移除。

在显式或默认启用 /OPT:REF 后,将启用受限形式的 /OPT:ICF(仅会折叠相同的函数)。 如果需要 /OPT:REF 而不是 /OPT:ICF,则必须指定 /OPT:REF,NOICF/OPT:NOICF

如果指定了 /DEBUG,则 /OPT 的默认项是 NOREF,而且所有函数都保留在映像中。 若要重写此默认项并优化调试生成,请指定 /OPT:REF。 由于 /OPT:REF 隐式使用 /OPT:ICF,建议你同时指定 /OPT:NOICF 以在调试生成中保留相同的函数。 这样更容易读取堆栈跟踪以及在本应折叠在一起的函数中设置断点。 /OPT:REF 选项禁用增量链接。

你必须将 const 数据显式标记为 COMDAT;使用 __declspec(selectany)

指定 /OPT:ICF 不启用 /OPT:REF 选项。

ICF[= iterations ] | NOICF

使用 /OPT:ICF[=iterations] 执行相同的 COMDAT 折叠。 可以从链接器输出中删除冗余 COMDAT。 可选 iterations 参数指定遍历符号以查找重复项的次数。 默认迭代次数是两次。 附加的迭代可以找到更多前一次迭代中未通过折叠发现的重复项。

指定 /OPT:REF 并且 ICF 默认为有效时的链接器行为方式与显式指定 /OPT:REF,ICF 时的行为方式不同。 单独使用 /OPT:REF 启用的 ICF 的窗体不折叠只读数据(包括 .rdata、.pdata 和 .xdata)。 因此,为 x64 生成映像时将折叠较少的函数,因为这些模块中的函数更依赖于只读数据(例如 .pdata 和 .xdata)。 若要获取完整的 ICF 折叠行为,请显式指定 /OPT:ICF

若要在 COMDAT 中放置函数,请使用 /Gy 编译器选项;若要放置 const 数据,请将其声明为 __declspec(selectany)。 有关如何指定用于折叠的数据的详细信息,请参阅 selectany

默认情况下,如果 REF 处于打开状态,则 ICF 处于打开状态。 若要重写此默认值,当指定 REF 时,请使用 NOICF。 当未在调试生成中指定 /OPT:ICF 时,你必须显式指定 /OPT:REF 以启用 COMDAT 折叠。 但是,由于 /OPT:ICF 能合并相同的数据或函数,因此它也能更改显示在堆栈跟踪中的函数名。 它还能使你无法在某些函数中设置断点或在调试器中检查某些数据,并让你在单步执行代码时进入意外的函数。 因此,建议不在调试生成中使用 /OPT:ICF,除非较小的代码的好处能弥补这些不足。

说明

由于 /OPT:ICF 可以使同一地址分配给不同的函数或只读数据成员(使用 /Gy 编译的 const 变量),因此它能中断依赖于函数或只读数据成员的唯一地址的程序。 有关详细信息,请参阅 /Gy(启用函数级链接)

LBR | NOLBR

/OPT:LBR/OPT:NOLBR 选项仅适用于 ARM 二进制文件。 由于某些 ARM 处理器分支指令的范围有限,因此如果链接器检测到跳转的地址超出范围,它就会将分支指令的目标地址替换成包含指向实际目标的分支指令的代码“岛”的地址。 可使用 /OPT:LBR 来优化对长分支指令的检测和中间代码岛的布局,以便最大程度减少总体代码大小。 /OPT:NOLBR 指示链接器为遇到的长分支指令生成代码岛,但不进行优化。

默认情况下,增量链接未启用时会设置 /OPT:LBR 选项。 如果需要非增量链接而不是长分支优化,请指定 /OPT:NOLBR/OPT:LBR 选项禁用增量链接。

优化通常是以增加链接时间为代价,减小映像大小并加快程序速度。

你可使用 /VERBOSE 选项查看由 /OPT:REF 移除的函数和由 /OPT:ICF 折叠的函数。

在 Visual Studio 开发环境中设置 OPT:ICF 或 OPT:REF 链接器选项

  1. 打开项目的“属性页”对话框。 有关详细信息,请参见使用项目属性
  2. 在左窗格中,展开“配置属性”、“链接器”和“优化”。
  3. 修改以下属性之一:
    • 启用 COMDAT 折叠
    • 引用

在 Visual Studio 开发环境中设置 OPT:LBR 链接器选项

  1. 打开项目的“属性页”对话框。 有关详细信息,请参见设置 Visual C++ 项目属性
  2. 选择 Linker 文件夹。
  3. 选择“命令行”属性页。
  4. 在“附加选项”中输入选项:

    /opt:lbr

这个太长。。。先不看

10./ALLOWBIND(禁止 DLL 绑定)

/ALLOWBIND[:NO]

/ALLOWBIND:NO 在 DLL 的标头中设置一个位,向 Bind.exe 指示不允许绑定图像。 如果 DLL 已经进行数字签名(绑定使签名无效),可能不需要绑定 DLL。

可以使用 EDITBIN 实用工具的 /ALLOWBIND 选项编辑 /ALLOWBIND 功能的现有 DLL。

在 Visual Studio 开发环境中设置此链接器选项

  1. 打开项目的“属性页”对话框。 有关详细信息,请参见使用项目属性
  2. 依次展开“配置属性”、“链接器”,然后选择“命令行”。
  3. 将 /ALLOWBIND:NO 输入到“附加选项”中。

未完,待续。。。。。

番外:

1./DELAYSIGN(为程序集进行部分签名)

/DELAYSIGN[:NO]

如果只想将公钥放入程序集中,则应使用 /DELAYSIGN。 默认值为 /DELAYSIGN:NO

如果不与 /KEYFILE/KEYCONTAINER 一起使用,则 /DELAYSIGN 选项没有任何作用。

如果要求完全签名的程序集,编译器将对包含清单(程序集元数据)的文件进行散列处理,并用私钥对该散列数据进行签名。 产生的数字签名存储在包含清单的文件中。 如果程序集的签名延迟,则链接器将不会计算和存储签名,但会在文件中保留空间以便以后添加签名。

例如,使用 /DELAYSIGN 将允许测试人员把程序集放入全局缓存中。 测试完成后,可以通过将私钥放入程序集中对程序集进行完全签名。

有关对程序集签名的更多信息,请参见 强名称程序集(程序集签名)(C++/CLI)延迟为程序集签名

其他影响程序集生成的链接器选项为:

在 Visual Studio 开发环境中设置此链接器选项

  1. 打开项目的“属性页”对话框。 有关详细信息,请参见设置 Visual C++ 项目属性
  2. 单击“链接器”文件夹。
  3. 单击“命令行”属性页。
  4. 将该选项键入“附加选项”框中。

涉及更多知识点,先押后待续。。。。。

2./DELAYLOAD(延迟加载导入)

/DELAYLOAD:dllname

/DELAYLOAD 选项导致 dllname 指定的 DLL 只能在程序第一次调用该 DLL 中的函数时加载。 有关详细信息,请参阅 链接器的延迟加载 DLL 支持。 你可以根据需要多次使用此选项,以便指定已选的多个 DLL。 当链接你的程序时,你必须使用 Delayimp.lib,或者也可以实现你自己的延迟加载 Helper 函数。

/DELAY 选项为每个延迟加载的 DLL 指定绑定和加载选项。

在 Visual Studio 开发环境中设置此链接器选项

  1. 打开项目的“属性页”对话框。 有关详细信息,请参阅 使用项目属性
  2. 在“链接器”文件夹中,选择“输入”属性页。
  3. 修改“延迟加载的 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 开发环境中设置此链接器选项

  1. 打开项目的“属性页”对话框。 有关信息,请参见使用项目属性
  2. 依次展开“配置属性”、“链接器”,然后选择“高级”。
  3. 修改“延迟加载的 DLL”属性。
				
时间: 2024-10-07 07:25:58

编译器选项的相关文章

Visual C++ 编译器选项/MD、/ML、/MT、/LD

前段时间编译一个引用自己写的静态库的程序时老是出现链接时的多个重定义的错误,而自己的代码明明没有重定义这些东西,譬如:LIBCMT.lib(_file.obj) : error LNK2005: ___initstdio already defined in libc.lib(_file.obj)LIBCMT.lib(_file.obj) : error LNK2005: ___endstdio already defined in libc.lib(_file.obj)LIBCMT.lib(_

makefile中一些编译器选项

makefile中一些编译器选项 CFLAGS CXXFLAGS CFLAGS 表示用于 C 编译器的选项 CXXFLAGS 表示用于 C++ 编译器的选项 这两个变量实际上涵盖了__编译__和__汇编__两个步骤 指定头文件(.h文件)的路径 CFLAGS=-I/usr/include -I/path/include (安装一个包时会在安装路径下建立一个include目录,当安装过程中出现问题时,试着把以前安装的包的include目录加入到该变量中来) LDFLAGS gcc等编译器会用到的一

C#编译器选项(目标平台)

用vs编译C#项目的设置中,“属性-生成-目标平台”有anycpu,x86,x64等选项. anycpu(默认值)将编译程序集为使其在任意平台上都可以运行. 在任何可能的时候,应用程序作为 64 位进程运行:仅当该模式只可用时,才会回退到 32 位. x86将程序集编译为由与 x86 兼容的 32 位公共语言运行时运行. x64 将程序集编译成可由 64 位公共语言运行库在支持 AMD64 或 EM64T 指令集的计算机上运行. 在 64 位 Windows 操作系统上: 用 /platform

如何使用gcc编译器

要想读懂本文,你需要对C语言有基本的了解,本文将介绍如何使用gcc编译器. 首先,我们介绍如何在命令行的方式下使用编译器编译简单的C源代码. 然后,我们简要介绍一下编译器究竟作了哪些工作,以及如何控制编译的过程. 我们也简要介绍了调试器的使用方法. gcc介绍 你能想象使用封闭源代码的私有编译器编译自由软件吗?你怎么知道编译器在你的可执行文件中加入了什么?可能会加入各种后门和木马.Ken Thompson是一个著名的黑客,他编写了一个编译器,当编译器编译自己时,就在'login'程序中留下后门和

C++异常机制的实现方式和开销分析 (大图,编译器会为每个函数增加EHDL结构,组成一个单向链表,非常著名的“内存访问违例”出错对话框就是该机制的一种体现)

白杨 http://baiy.cn 在我几年前开始写<C++编码规范与指导>一文时,就已经规划着要加入这样一篇讨论 C++ 异常机制的文章了.没想到时隔几年以后才有机会把这个尾巴补完 :-). 还是那句开场白:“在恰当的场合使用恰当的特性” 对每个称职的 C++ 程序员来说都是一个基本标准.想要做到这点,就必须要了解语言中每个特性的实现方式及其时空开销.异常处理由于涉及大量底层内容,向来是 C++ 各种高级机制中较难理解和透彻掌握的部分.本文将在尽量少引入底层细节的前提下,讨论 C++ 中这一

使用Intel编译器获得一致的浮点数值计算结果

大多数十进制的浮点数, 用二进制表示时不是完全一致的; 与此同时, 大多数与浮点数值相关的计算结果, 存在着固有的不确定性. 通常, 编写浮点计算应用软件希望达到如下的目标:  - 准确性:     意味着该产品产生的计算结果,应当"接近"于实际计算的结果; 评判的标准是误差值, 有时候也采用最后几位("units in the last place", ulp)  - 可复制性:    意味着该产品始终产生一致的结果, 无论运行的先后, 采用不同的编译选项, 使用

[编译器]dev c++单步调试

一.dev c++调试崩溃的解决方案 1.点击“工具 -> 编译选项”. 2.选择“编译器”选项卡,勾选“编译时加入以下命令”,输入“-g3”. 3.选择“代码生成/优化”选项卡,选择“连接器”选项卡,将“产生调试信息”选为“Yes”. 4.点击确定,重新编译需要调试的程序,就可以单步运行了. 二.单步调试 1.设置断点:在行号附近单击即可,如何调出行号,请转到文末. 2.单击“调试”按钮. 当然也可以在“运行”里找到: 这时界面是这样的: 蓝色的横行左侧带有一个蓝色的箭头,代表当前单步执行的位

fatal error C1859 意外的预编译头错误,只需重新运行编译器(转)

微软的建议 要解决此问题,请使用下列方法之一. http://support.microsoft.com/kb/976656/zh-cn 方法 1 禁用/analyze编译器选项,则它会被启用. 方法 2 开始清理生成. 方法 3 重新启动计算机. 方法 4 禁用创建/使用预编译头的编译器选项. 注意这些方法不能保证正常工作.即使您使用这些方法之一,您可能仍会遇到此问题. 我的解决方案,生成 ->仅用于项目->仅清理  生成->清理解决方案, 生成 ->清理项目

编译器报错汇总

1.arm7 arm7s 真机32位处理器 arm64  真机64位处理器 2.i386 模拟器32位处理器   x86_64模拟器64位处理器 3.linker .o  可能有依赖库未导入 , 库重复导入: 4.libsqlite3 数据库 今天试了一下iPhone Sqlite3数据库实例操作,发现一个有意思的问题,就是在加Framework时,有些教程说加libsqlite3.dylib有些说加libsqlite3.0.dylib,那到底加哪个呢?经过百度和谷歌得答案如下: 实际上libs