Visual+c++编译器选项.docx
《Visual+c++编译器选项.docx》由会员分享,可在线阅读,更多相关《Visual+c++编译器选项.docx(97页珍藏版)》请在冰豆网上搜索。
Visual+c++编译器选项
VisualC++编译器选项
目录:
一、编译器选项
(指定编译器响应文件)……………………………………………………………3
/AI(指定元数据目录)………………………………………………………………3
/analyze(企业代码分析)…………………………………………………………4
/arch(最小CPU结构)……………………………………………………………5
/bigobj(增加.obj文件中的节数量)……………………………………………6
/C(在预处理期间保留注释)………………………………………………………7
/c(编译但不)…………………………………………………………………7
/clr(公共语言运行库编译)………………………………………………………8
/D(预处理器定义)…………………………………………………………………13
/doc(处理文档注释)………………………………………………………………14
/E(预处理到stdout)………………………………………………………………16
/EH(异常处理模型)…………………………………………………………………17
/EP(不使用#line指令预处理到stdout)………………………………………19
/errorReport(报告部编译器错误)……………………………………………20
/F(设置堆栈大小)…………………………………………………………………22
输出文件(/F)选项………………………………………………………………23
/favor(针对64位进行优化)……………………………………………………23
/FC(所诊断源代码文件的完整路径)………………………………………………24
/fp(指定浮点行为)………………………………………………………………25
/G(处理器优化)选项………………………………………………………………28
/GA(Windows应用程序优化)………………………………………………………29
/Gd、/Gr、/Gz(调用约定)……………………………………………………………29
/Ge(启用堆栈探测)…………………………………………………………………31
/GF(消除重复的字符串)……………………………………………………………32
/GH(启用_pexit挂钩函数)……………………………………………………34
/Gh(启用_penter挂钩函数)……………………………………………………35
/GL(全程序优化)……………………………………………………………………35
/Gm(启用最小重新生成)…………………………………………………………36
/GR(启用运行时类型信息)…………………………………………………………37
/GS(缓冲区安全检查)………………………………………………………………38
/Gs(控制堆栈检查调用)……………………………………………………………40
/GT(支持纤程安全的线程本地存储区)……………………………………………41
/GX(启用异常处理)………………………………………………………………41
/Gy(启用函数级)……………………………………………………………42
/GZ(启用堆栈帧运行时错误检查)………………………………………………43
/H(限制外部名称长度)……………………………………………………………44
/HELP(编译器命令行帮助)…………………………………………………………45
/homeparams(将寄存器参数复制到堆栈)………………………………………46
/hotpatch(创建可热修补的映像)………………………………………………46
/I(附加的包含目录)………………………………………………………………47
/J(默认char类型是unsigned)………………………………………………48
/link(将选项传递到器)……………………………………………………49
/LN(创建MSIL模块)……………………………………………………………49
/MD、/MT、/LD(使用运行时库)…………………………………………………50
/nologo(取消显示启动标志)………………………………………………52
/O选项(优化代码)………………………………………………………………52
/openmp(启用OpenMP2.0支持)………………………………………………53
/P(预处理到文件)…………………………………………………………………55
/Q选项(低级别操作)………………………………………………………………56
/RTC(运行时错误检查)……………………………………………………………56
/showIncludes(列出包含文件)……………………………………………………59
/Tc、/Tp、/TC、/TP(指定源文件类型)…………………………………………60
/U、/u(取消符号定义)………………………………………………………………61
/V(版本号)…………………………………………………………………………62
/vd(禁用构造置换)…………………………………………………………………63
/vmb、/vmg(表示方法)……………………………………………………………64
/vmm、/vms、/vmv(通用用途表示形式)……………………………………………65
/w、/Wn、/WX、/Wall、/wln、/wdn、/wen、/won(警告等级)……………………66
/WL(启用单行诊断)…………………………………………………………………68
/Wp64(检测64位可移植性问题)…………………………………………………69
/X(忽略标准包含路径)……………………………………………………………70
/Y(预编译头)………………………………………………………………………71
/Z7、/Zi、/ZI(调试信息格式)………………………………………………………71
/Za、/Ze(禁用语言扩展)……………………………………………………………73
/Zc(一致性)…………………………………………………………………………74
/Zg(生成函数原型)…………………………………………………………………74
/Zl(省略默认库名)…………………………………………………………………75
/Zm(指定预编译头的存分配限制)………………………………………………76
/Zp(结构成员对齐)…………………………………………………………………77
/Zs(只进行语法检查)………………………………………………………………78
/Zx(调试经过优化的Itanium代码)……………………………………………79
二、网上摘录小技巧…………………………………………………………………79
(来自MSDN技术资源库,只为方便查阅而下载整理.Xsf2008.01.12)
一、VisualC++编译器选项
1.@指定编译器响应文件。
@response_file
参数response_file包含编译器命令的文本文件。
备注:
响应文件可以包含任何想在命令行上指定的命令。
如果使用计算机(Windows95、Windows98、Windows98SecondEdition、WindowsMillenniumEdition)且命令行参数超过127个字符,这可能相当有用。
不能从响应文件部指定@选项。
即一个响应文件不能嵌入另一个响应文件。
可以从命令行指定所需数量的响应文件选项(例如@respfile.1@respfile.2)。
在VisualStudio开发环境中设置此编译器选项
∙无法从开发环境部指定响应文件,而必须在命令行上指定。
以编程方式设置此编译器选项
∙不能以编程方式更改此编译器选项。
2./AI(指定元数据目录)
指定在解析传递给#using指令的文件引用时编译器将搜索的目录。
/AIdirectory
参数directory编译器要搜索的目录或路径。
备注:
只能将一个目录传递给/AI调用。
为要编译器搜索的每个路径指定一个/AI选项。
在VisualStudio开发环境中设置此编译器选项
1.打开该项目的“属性页”对话框。
有关详细信息,请参见如何:
打开项目属性页。
2.单击“C/C++”文件夹。
3.单击“常规”属性页。
4.修改“解析#using引用”属性。
以编程方式设置此编译器选项
∙请参见AdditionalUsingDirectories。
VisualC++编译器选项
3./arch(最小CPU结构)
使用流式处理SIMD扩展(SSE)和流式处理SIMD扩展2(SSE2)指令指定生成代码的结构。
/arch:
[SSE|SSE2]
备注
注意
/arch仅在为x86平台编译时可用。
为x64或Itanium进行编译时,此编译器选项不可用。
SSE指令在各种Pentium和AMDAthlon处理器中均存在。
SSE2指令仅存在于Pentium4处理器中。
/arch:
SSE允许编译器使用SSE指令,而/arch:
SSE2允许编译器使用SSE2指令。
_M_IX86_FP指示使用哪个/arch编译器选项(如果有);有关更多信息,请参见PredefinedMacros。
在指定/arch时,优化程序将选择何时以及如何使用SSE和SSE2指令。
当确定使用SSE/SSE2指令和寄存器肯定要比使用x87浮点寄存器堆栈更快时,SSE和SSE2指令将用于某些标量浮点计算。
因此,您的代码实际上将混合使用x87和SSE/SSE2来进行浮点计算。
此外,通过/arch:
SSE2,可将SSE2指令用于某些64位整数运算。
除了使用SSE和SSE2指令之外,编译器还将使用在支持SSE和SSE2的处理器修订版上提供的其他指令。
例如,在Intel处理器的PentiumPro修订版中首次出现的CMOV指令。
在使用/clr(公共语言运行库编译)进行编译时,/arch对托管函数的代码生成没有任何影响。
/arch只影响本机函数的代码生成。
/arch和/QIfist(取消_ftol)不能在同一compiland上使用。
特别是,如果用户没有使用_controlfp修改FP控制字,则运行库启动代码会将x87FPU控制字精度控制字段设置为53位,这样,表达式的所有浮点运算和双精度运算都以53位有效数和15位指数进行。
但是,所有SSE单精度运算都将使用24位有效数/8位指数,而SSE2双精度运算将使用53位有效数/11位指数。
有关更多信息,请参见_control87,_controlfp,__control87_2。
例如,在单个表达式树中可能会出现这些差异,而在每一子表达式后存在用户赋值的情况下则不会:
复制代码
r=f1*f2+d;//DifferentresultsarepossibleonSSE/SSE2.
相对于:
复制代码
t=f1*f2;//Dof1*f2,roundtothetypeoft.
r=t+d;//Thisshouldproducethesameoverallresult
//regardlesswhetherx87stackorSSE/SSE2isused.
controlfp不更改MXCSR控制位,因此,对于/arch:
SSE2,任何依赖于使用controlfp的功能都将被破坏。
在VisualStudio开发环境中设置此编译器选项
1.打开该项目的“属性页”对话框。
有关详细信息,请参见如何:
打开项目属性页。
2.单击“C/C++”文件夹。
3.单击“代码生成”属性页。
4.修改“启用增强指令集”属性。
以编程方式设置此编译器选项
∙请参见EnableEnhancedInstructionSet。
VisualC++编译器选项
/analyze(企业代码分析)
启用代码分析。
4./analyze[:
WX-]
备注:
使用/WX进行编译时,指定/analyze:
WX-意味着代码分析警告将不会被视为错误。
有关更多信息,请参见/w、/Wn、/WX、/Wall、/wln、/wdn、/wen、/won(警告等级)。
/analyze仅在x86编译器的企业(团队开发)版本中可用。
有关代码分析的更多信息,请参见C/C++代码分析概述和针对C/C++警告的代码分析。
在VisualStudio开发环境中设置此编译器选项
1.打开此项目的“属性页”对话框。
有关详细信息,请参见如何:
打开项目属性页。
2.展开“配置属性”节点。
3.展开“代码分析”节点。
4.选择“常规”属性页。
5.修改一个或多个“代码分析”属性。
以编程方式设置此器选项
∙请参见EnablePREfast。
5./bigobj(增加.obj文件中的节数量)
/bigobj增加对象文件可包含的节数。
/bigobj
备注
默认情况下,对象文件最多可存放65,536(2^16)个可寻址的节。
/bigobj可将该地址容量增加至4,294,967,296(2^32)。
大多数模块将从来不会生成包含节数超过65,536的.obj文件。
但是,计算机生成的代码或大量使用模板库的代码可能需要可存放更多节的.obj文件。
只有VisualC++2005(或更高版本)中提供的器才能使用通过/bigobj生成的.obj文件。
VisualC++2005之前的版本中所提供的器不能读取使用/bigobj生成的.obj文件。
在VisualStudio开发环境中设置此编译器选项
1.打开该项目的“属性页”对话框。
有关详细信息,请参见如何:
打开项目属性页。
2.单击“C/C++”文件夹。
3.单击“命令行”属性页。
4.在“附加选项”框中键入编译器选项。
以编程方式设置此编译器选项
∙请参见AdditionalOptions。
6./C(在预处理期间保留注释)
/C:
在预处理期间保留注释。
备注
此编译器选项需要/E、/P或/EP选项。
下面的代码示例将显示源代码注释。
复制代码
//C_compiler_option.cpp
//compilewith:
/E/C/c
inti;//avariable
此示例将生成以下输出。
复制代码
#line1"C_compiler_option.cpp"
inti;//avariable
在VisualStudio开发环境中设置此编译器选项
1.打开此项目的“属性页”对话框。
有关详细信息,请参见如何:
打开项目属性页。
2.单击“C/C++”文件夹。
3.单击“预处理器”属性页。
4.修改“保留注释”属性。
以编程方式设置此编译器选项
∙请参见KeepComments。
7./c(编译但不)
禁止自动调用LINK。
/c
备注
用/c编译将只创建.obj文件。
必须用正确的文件和选项显式调用LINK,才能执行生成的阶段。
默认情况下,在开发环境中创建的任何部项目都使用/c选项。
在VisualStudio开发环境中设置此编译器选项
∙此选项从开发环境部不可用。
以编程方式设置此编译器选项
∙若要以编程方式设置此编译器选项,请参见CompileOnly。
示例
下列命令行创建对象文件FIRST.obj和SECOND.obj。
忽略THIRD.obj。
复制代码
CL/cFIRST.CSECOND.CTHIRD.OBJ
若要创建可执行文件,必须调用LINK:
复制代码
LINKfirsti.objsecond.objthird.obj/OUT:
filename.exe
8./clr(公共语言运行库编译)
使应用程序和组件能够使用公共语言运行库(CLR)中的功能。
/clr[:
options]
参数
options
以下一个或多个选项,以逗号分隔:
/clr
为您的应用程序创建可由其他CLR应用程序使用的元数据,并允许您的应用程序使用其他CLR组件的元数据中的类型和数据。
有关更多信息,请参见:
∙混合(本机和托管)程序集
∙如何:
迁移到/clr
/clr:
pure
生成仅包含MSIL的输出文件,其中不包含任何本机可执行代码,但是可以包含编译为MSIL的本机类型。
有关更多信息,请参见纯代码和可验证代码。
/clr:
safe
生成仅包含MSIL(无本机可执行代码)且可验证的输出文件。
/clr:
safe启用验证诊断(PEVerify工具(Peverify.exe))。
有关更多信息,请参见编写可验证为类型安全的代码。
/clr:
oldSyntax
针对C++语法(CLR编程的原始VisualC++语法)启用托管扩展。
在MicrosoftVisualC++2005中,不赞成使用C++语法的托管扩展。
如果要维护使用C++托管扩展的VisualC++应用程序,则只应当使用/clr:
oldSyntax。
如果要开发新应用程序,请使用更新的语法;有关更多信息,请参见NewC++LanguageFeatures。
如果您拥有C++应用程序的托管扩展,就可以开始停靠您的项目以使用新语法;有关更多信息,请参见移植和升级程序。
/clr:
noAssembly
指定程序集清单不应插入到输出文件中。
默认情况下,noAssembly无效,并且将程序集清单插入到输出文件中。
清单中不包含程序集元数据的托管程序称为“模块”。
有关生成模块的原因,请参见/LN(创建MSIL模块)。
仅在DLL为编译输出文件时,才可以使用noAssembly。
如果使用/c(编译但不)和/clr:
noAssembly进行编译,则应在器阶段指定/NOASSEMBLY(创建MSIL模块)选项以创建模块。
noAssembly在VisualC++2005中被否决。
应改用/LN(创建MSIL模块)。
有关更多信息,请参见否决的编译器选项。
在VisualC++2005之前,/clr:
noAssembly暗示/clr。
但是,现在/clr还支持/clr:
oldSyntax,因此必须在指定/clr:
noAssembly时指定一个/clr形式。
例如,/clr:
noAssembly /clr使用新的VisualC++CLR语法创建模块,而/clr:
noAssembly,oldSyntax使用C++托管扩展创建模块。
在VisualC++2005之前,/clr:
noAssembly需要/LD。
而现在/LD通过指定/clr:
noAssembly来表示。
/clr:
initialAppDomain
允许VisualC++应用程序在公共语言运行库版本1中运行。
如果使用initialAppDomain,则可以参见知识库文章Q309694中讨论的一些问题。
可以查找MSDNLibrary媒体中或support.microsoft./default.aspx?
ln=zh-cn中的知识库文章。
用initialAppDomain编译的应用程序决不应该由使用ASP.NET的应用程序使用。
应升级到较新的运行库,以便用C++执行ASP.NET任务。
备注
托管代码是可由公共语言运行库检查和管理的代码。
托管代码可以访问托管对象。
另请参见/clr限制。
有关如何开发定义和使用托管类型的应用程序的信息,请参见NewC++LanguageFeatures。
使用/clr编译的应用程序可能包含托管数据,也可能不包含托管数据。
若要允许在托管应用程序中进行调试,请参见/ASSEMBLYDEBUG(添加DebuggableAttribute)。
只有CLR类型将在垃圾回收堆中进行实例化。
有关更多信息,请参见ClassesandStructs(Managed)。
若要将函数编译为本机代码,请使用unmanaged杂注。
有关更多信息,请参见managed,unmanaged。
默认情况下,/clr无效。
当/clr生效时,/MD也将生效(有关更多信息,请参见/MD、/MT、/LD(使用运行时库))。
/MD确保从标准头(.h)文件中选择运行库例程的动态的多线程版本。
多线程处理是托管编程所必需的,其中一部分原因是CLR垃圾回收器将在辅助线程中运行终结器。
如果使用/c进行编译,则可以使用/CLRIMAGETYPE(指定CLR映像的类型)指定生成的输出文件的CLR类型(IJW类型、安全类型或纯类型)。
/clr暗指/EHa,不允许其他/EH选项与/clr一起使用。
有关更多信息,请参见/EH(异常处理模型)。
有关如何确定文件的CLR映像类型的信息,请参见/CLRHEADER。
必须使用同一个运行时库编译器选项(/MD或/LD)编译传递到给定器调用的所有模块。
使用/ASSEMBLYRESOURCE(嵌入托管资源)器选项在程序集中嵌入资源。
/DELAYSIGN(为程序集进行部分签名)、/KEYCONTAINER(指定密钥容器以便为程序集签名)和/KEYFILE(指定密钥或密钥对以便为程序集签名)器选项也可用于自定义程序集的创建方式。
使用/clr时,_MANAGED符号被定义为1。
有关更多信息,请参见PredefinedMacros。
首先将初始化本机对象文件中的全局变量(如果可执行文件为DLL,则在DllMain期间),然后将初始化托管部分中的全局变量(在运行任何托管代码之前)。
#pragmainit_seg仅影响托管和非托管类别中的初始化顺序。
使用/clr:
safe进行编译与对诸如C#等语言使用/platform:
anycpu进行编译很相似。
安全映像和纯映像
纯映像将使用C运行时库的CLR版本。
但是,CRT无法验证,因此使用/clr:
safe进行编译时不能使用CRT。
有关更多信息,请参见CRun-TimeLibraries。
不能出现在纯映像中的本机代码的示例包括联程序集、setjmp或longjmp。
纯映像或安全映像的每个入口点都被托管。
使用/clr进行编译时,入口点是本机入口点。
有关更多信息,请参见__clrcall。
使用/clr:
safe进行编译时,变量