VC命令行编译C++.doc_第1页
VC命令行编译C++.doc_第2页
VC命令行编译C++.doc_第3页
VC命令行编译C++.doc_第4页
VC命令行编译C++.doc_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

编译器 cl.exe连接器 mlink.exe编译格式:cl option. file. option | file. lib. command-file /link link-opt.option是编译参数file是编译的源文件lib是程序需要的依赖库command-file是命令行文件当命令行参数过长,CMD不支持时,可将一部分命令移到文件中,附加该文件使得文件中的命令有效link-opt 是链接选项,在输入/link后输入链接选项,则可以把这些选项传递给链接器。注意:在格式中option file option file 虽然是options是分开了,但是所有的options都是同时作用于所有file的。例如 cl /MT main.cpp /LD submain.cpp 的意思是 /MT /LD同时对这个两个文件起作用。相同的/互斥的参数,以后出现的为准。例如 cl /Fo”src” main.cpp /Fo”symbol” submain.cpp 生成的obj文件都会放在symbol文件夹下。下面介绍编译器(cl)的参数(options)有些参数后面标记过期,该参数在VS2005下仍然有效,但是在后续版本中可能会被删除。在VS2005中可能会有其他参数来代替过期参数,在各个过期参数中会有说明。优化选项:/O1体积最小优化 相当于/Og /Os /Oy /Ob2 /Gs /GF /Gy的组合/O2速度最快优化 相当于/Og /Oi /Ot /Oy /Ob2 /Gs /GF /Gy的组合/Ob扩展inline函数。/Ob0 禁用内联。默认值。/Ob1 仅仅内联被标识为 inline,_inline _forceinline,在class定义中写函数实现 的函数。例如class CTest public:int GetInt()return m_iInt;private:int m_iInt;该函数在/Ob1的参数下,会被编译成内联函数。/Ob2 包含/Ob1的情况,并且编译器会把可以编译成内联,但是没有加上inline关键字的函数内联。/Oy 省略帧指针。该参数被/O1 /O2 /Ox包含,如果需要使用帧指针,可以在后面加上/Oy-,即可使/Oy失效,该参数仅在x86下有效。/Od 禁用Debug,加快编译速度,简化调试功能。/Og 过期 全局优化 包括表达式省略和循环优化。表达式省略:a = b + c;d = b + c;e = b + c;在该优化下,b+c的值只计算一次存入临时变量。循环优化:i = -100;while(i0)i += x + y;在该优化下,x + y的值会先计算出来,等效于:i = -100;t = x + y;while(i0)i += t;/Oi用函数体替换函数调用。编译器会将内建函数的函数体替换掉函数调用语句,这样可以避免函数调用时的开销提高运行速度,但是扩大了代码长度。只有内建的函数才能被替换。库函数中的内建函数如下:_disable _outp fabs strcmp_enable_outpwlabsstrcpy_inp_rotl memcmp strlen_inpw_rotrmemcpy_lrotl_strsetmemset_lrotrabsstrcat内建函数不存在于库中,而存在于编译器中。/Os代码长度优化/Ot运行速度优化以上两个优化只能取一种例子:对于函数int differ(int x) return x * 71;如果选择/Os 代码长度优化,则编译为 mov eax, DWORD PTR _x$ebp imul eax, 71;长度很短,但是该计算比较慢如果选择/Ot 运行速度优化,则编译为mov eax, DWORD PTR _x$ebp mov ecx, eax shl eax, 3 lea eax, DWORD PTR eax+eax*8 sub eax, ecx/Ox 全面优化,默认速度优先。/Osx为代码长度优先总体来说用 /O2 比/Ox 好,用/O1比 /Oxs好。/Ox 等价于 /Ob2 /Og /Oi /Ot /Oy/Osx 等价于/Ob2 /Og /Oi /Os /Oy代码生成选项:/arch/arch:SSE 允许采用SSE指令 /arch:SSE2允许采用SSE2指令。SSE 可参考/view/65687.htmSSE2 可参考/view/65695.htm该参数仅应用于x86平台,在x64和Itanium处理上无效。SSE存在于各种奔腾和AMD Athlon处理器上,而SSE2仅存在于奔4处理器。当出现/clr编译选项时,/arch则不会对托管代码生效,仅仅对本地代码生效。/bigobj默认情况下obj文件拥有65536个addressable段。使用该参数后将扩大为4294967296。大部分的模块将不会超过65536个段。但是某些自动生成的代码,或者大量使用了模板库的代码可能会使用更多的段。只有VC2005及其以后的版本才使用该参数,在此版本之前的链接器不能识别用该参数产生的obj文件。/clr使得程序或者组件能够使用CLR特性。不指定参数则可以使用托管代码和非托管代码的混编。/clr:pure 可以包含托管和非托管的数据类型,但是只能使用托管代码。而该参数编译下的机器码不能被非托管函数调用。所以该编译选项出来的文件不能继承COM接口或者暴露出非托管的回调函数。而且也不能由def文件和_declspec(dllexprot) 导出函数。/clr:safes生成纯MSIL,可修改的文件。该选项要求只能包含托管代码和托管变量。/clr: noAssembly过期 使用/LN/EH编译器是否使用异常处理模块。/EH后面必须使用s或者a 即 /EHs /EHa 也可附加c选项/EHa 异常处理模块捕获结构异常并通知编译器extern C函数可抛出异常。/EHs 异常处理模块不捕获结构异常并通知编译器extern C函数可抛出异常。/EHac 异常处理模块捕获结构异常并通知编译器确保extern C函数不抛出异 常。/Ehsc 异常处理模块不捕获结构异常并通知编译器确保extern C 函数不抛出 异常。例:#include #include using namespace std;void fail() try int i = 0, j = 1; j /= i;catch(.) / catch block will only be executed under /EHa coutCaught an exception in catch(.).endl; int main() _try fail(); _except(EXCEPTION_EXECUTE_HANDLER) cout An exception was caught in _except. 0)Infinite1.#INF-N/0 (N0)-Infinite-1.#INF0 * INFNaN0 * -INFNaN0 / INF0INF * INFInfiniteINF * -INF-InfiniteINF / 0InfinateN * INFINFNaN 参与计算NaN/fp:strictThe strictest floating-point model. /fp:strict causes fp_contract to be OFF and fenv_access to be ON. /fp:except is implied and can be disabled by explicitly specifying /fp:except-. When used with /fp:except-, /fp:strict enforces strict floating-point semantics but without respect for exceptional events./G1Itanium处理器优化选项,仅适用于Itanium cross编译器和Itanium native编译器。/G2Itanium2处理器优化选项。仅适用于Itanium cross编译器和Itanium native编译器。VC所有版本均支持/G选项,当/G和/O同时使用时,可获得更好的优化效果,但是在VC标准版上却不提供/O参数。/Gd默认设置,对于没有显示指定调用约定的函数则指定为_cdecl调用约定。类成员函数,_stdcall和_fastcall函数不受影响。/Gr对于没有显示指定调用约定的函数则指定为_fastcall调用约定。类成员函数,_cedcl和_stdcall函数不受影响。注:所有的_fastcall函数必须有函数原型。/Gz对于没有显示指定调用约定的函数则指定为_stdcall调用约定。类成员函数,_cdecl和_fastcall函数不受影响。所有的_stdcall函数必须有函数原型。/Ge已过期,为每个需要临时变量存储的函数调用打开堆栈探查。微软建议采用/Gh代替该参数。/Gs有相同的效果。/GF使用字符串池,使用字符串池后,编译器为重复的常量字符串在内存中创建一份实例。例如如下程序:char * pStr1 = ”this is a string”;char * pStr2 = “this is a string”;printf(“%x,%x”,pStr1,pStr2);若使用了/GF则打印出的地址值是相同的,在内存中仅有一份”this is a string”。若不使用/GF则打印出不同的地址。内存中有2份”this is a string”;当打开/Z7 /Zi /ZI参数时,则自动采用该参数。/Gh打开_penter钩子函数。调用函数时,在执行函数体之前,会先调用对应的_penter函数。例如:#include void x() printf(“ in x n”);int main() printf(“in main n”); x();extern C void _declspec(naked) _cdecl _penter( void ) _asm push eax push ebx push ecx push edx push ebp push edipush esi printf_s(nIn a function!); _asm pop esi pop edi pop ebp pop edx pop ecx pop ebx pop eax ret 使用/Gh参数编译,运行结果为:In a function!in mainin a function!in x由于指定了void fun(void)的_penter钩子函数,在/Gh参数下,只要调用了形如void fun(void)的函数,则会先执行_penter钩子函数,然后才执行函数体。没有使用/Gh参数编译的程序,运行结果为:in mainin x/GH打开_pexit钩子函数。调用函数时,在执行函数体之后,会先调用对应的_pexit函数。用法类似/Gh./GL打开整体优化。整体优化使得编译器对所有的模块进行信息搜集并进行优化。否则编译器仅对每个模块单独做优化。编译器默认是不打开该参数,必须显示指明该参数,才能够打开整体优化。整体优化包括:1在函数调用的边界优化寄存器。2更好的优化全局变量,跟踪并分析全局变量。减少全局变量的读取和存储次数。3更好的优化指针解引用。减少指针变量的读取和存储次数。4在不同模块之间内联函数。Editbin和Dumpbin不能打开使用/GL参数编译的obj文件。如果同时使用/GL和/c,在产生输出文件的时候,需要加链接选项/LTCG。/Z7 /Zi /ZI不能和/GL同时使用。/Gm打开最小重编译选项。该参数需要指定/Zi或者/ZI。在编译过一次的情况下,再次编译仅仅编译被修改过的代码。当出现/Z7时,该参数无效。/GR添加检测对象在运行期的类别的代码。在VC2005中默认打开该选项。/GR-关闭运行时类型信息。如果在程序中使用了dynamic_cast或者typeid,则打开该参数。如果没有使用dynamic_cast或typeid,使用/GR-可以减少输出文件的大小。/Gs该选项是堆栈探测的高级特性。堆栈探测是编译器插在每个函数中的一系列代码。当堆栈探测被激活时,会检测函数中局部变量所使用的内存空间。如果函数需要更多的内存空间,则打开堆栈探测。默认每个分页的大小为:4KB for x864KB for x648KB for Itanium该参数允许操作系统为程序动态增加堆栈大小。/GT支持纤程安全的线程本地存储。被_declspec(thread)指定的数据和一个叫做thread-local storage(TLS)数组相关。TLS数组是一系列由系统维护每个线程的地址数组。每个地址都指向各个线程的本地的数据。纤程是轻量级的对象,是由一个栈和一个寄存器上下文组成,可被多个线程调度。纤程可在任何线程上运行。由于纤程可在一个线程中停止,在另外的线程上继续执行,所以TLS数组不能被放入缓存中,也不能被当做跨函数调用的子表达式来进行优化。该参数阻止这类优化。/GX同步异常处理,并确保extern C函数不显式抛出异常。默认情况下设置该参数。可在命令行编译时,用/GX-来取消。该参数已过期,用/EH来代替。/Gy允许编译器打包单个函数(将打包函数存放在COMDAT段中)。一般情况下编译器仅对inline函数(成功inline,不一定包括所有加inline关键字的函数)和在类声明中定义的函数进行打包。并不会将其他函数打包。使用该参数后,编译器会将所有函数打包,以便于进行函数的排除优化和链接排序。使用/OPT 和/ORDER进行排除优化和链接排序。而/OPT和/ORDER仅仅对打包函数起作用。例如下程序:#include #include void NoReferenceFun(int * p, char * c,char a);int main(void)char a; /NoReferenceFun(0,0,a); return 0;void NoReferenceFun(int * p, char * c,char a)if(p)*p=5;if(c)*c = a;a = *c;std:cout ffsfsdfs1 std:endl;std:cout ffsfsdfs2 std:endl;std:cout ffsfsdfs3 std:endl;std:cout ffsfsdfs4 std:endl;std:cout ffsfsdfs5 std:endl;std:cout ffsfsdfs6 std:endl;std:cout ffsfsdfs7 std:endl;std:cout ffsfsdfs8 std:endl;std:cout ffsfsdfs9 std:endl;std:cout ffsfsdfsa std:endl;std:cout ffsfsdfsb std:endl;std:cout ffsfsdfsc std:endl;std:cout ffsfsdfsd std:endl;std:cout ffsfsdfse std:endl;std:cout ffsfsdfsf std:endl;std:cout ffsfsdfsg std:endl;std:cout ffsfsdfsh std:endl;std:cout ffsfsdfsi std:endl;std:cout ffsfsdfsj std:endl;std:cout ffsfsdfsk std:endl;std:cout ffsfsdfsl std:endl;std:cout ffsfsdfsm std:endl;std:cout ffsfsdfsn std:endl;std:cout ffsfsdfso std:endl;std:cout ffsfsdfsp std:endl;std:cout ffsfsdfsq std:endl;std:cout ffsfsdfsr std:endl;std:cout ffsfsdfss std:endl;std:cout ffsfsdfst std:endl;std:cout ffsfsdfsu std:endl;std:cout ffsfsdfsv std:endl;std:cout ffsfsdfsw std:endl;无论是否注释掉NoReferenceFun(0,0,a);函数的调用,使用cl /EHsc /Gy-main.cpp /OPT:REF编译出来的文件都是124K如果使用了cl /EHsc /Gy main.cpp /OPT:REF,当注释掉NoReferenceFun(0,0,a);函数调用时,编译出来的文件时120K。说明只有用了/Gy把独立函数打包放在COMDAT里面,/OPT:REF才能对该函数进行优化。排序同理。文件输出选项:/FA生成汇编代码文件。*.asm文件。/FA汇编代码 .asm/FAc机器码和汇编代码 .cod/FAs源文件和汇编代码 .asm源文件以注释的形式出现在.asm中/FAcs源文件和汇编代码 .cod源文件以注释的形式出现在.cod中。/FAu用UTF-8的格式输出文件,编译器默认用ANSI格式输出。如果采用unicode编码的源文件则需要该选项。但是经过测试采用该选项后cl会creash。测试系统 windowsXP sp2中文企业版,VS2005 sp1。/Fa指定/FA产生的文件路径,文件名,扩展名。/Fa”filename”生成指定的文件,filename可带路径。仅用于编译单个文件。/Fa”directory”路径字符串结尾要用,例如”C:projectsymbol”否则会当成文件名。/Fa”filename.extention”生成指定文件名,扩展名的汇编文件。filename可带路径仅用于编译单个文件。/Fd指定program database(pdb)文件名。在/Z7 /Zi /ZI参数下有效。如果没有该系列参数将不会产生pdb文件。不指定文件名的情况下将产生VCx0.pdb,x为VC的主版本号。如果指定了文件目录没有指定文件名,则会在对应文件目录下生成VCx0.pdb文件。该参数同样会指定idb文件名。/Fe重命名可执行文件名称及路径。例如:cl /Fec:projectbinmain.exe main.cpp/Fm生成map文件。 /Fm和链接参数/MAP有相同的效果。如果采用了/c则该参数无效。/Fo重命名.obj文件。/Fp重命名预编译头文件.pch文件。在参数/Yc或者/Yu下有效。如果没有该系列参数将会不产生pch文件。/FR/Fr创建sbr文件。在构建工程过程中,BSCMAKE工具使用sbr文件创建BSC文件,用户显示浏览信息。/FR创建带有全部符号信息的sbr文件/Fr 创建没有局部变量符号信息的sbr文件。如果没有指定文件名,则默认用源代码文件名。扩展名为sbr不可改变。/FRpathnamefilename/Fr在VC2005中已过期,使用/FR替代。/Fx合并输入代码。编译器会在源代码中注入一些代码。使用该参数后,会将注入的代码合并入源代码代码中。并输出filename.mrg.cpp或者filename.mrg.h文件。在mrg文件中注入代码以/+ Start Injected Code开始。以/- End Injected Code结尾。调试选项:/GS缓存检测参数。检测缓存访问越界而导致返回地址的覆盖,一般情况下并不是采用强制指定缓存大小来避免缓存的越界访问,而是在编译好的代码中注入一小段安全检测程序。该参数默认为打开状态。可以使用/GS-来关闭该状态。/GZ打开栈帧的运行时错误检查。已过期,用/RTC代替。参见/RTC。/GZ仅在没有优化的编译下有效(/Od 取消优化)。/homeparams将寄存器参数入栈。在函数入口,强制将寄存器参数存入函数栈中。该选项仅在x64下有效。/RTC打开运行时错误检测。/RTC1 和/RTCsu等效。/RTCc 类型转换有数据丢失的情况下抛出异常。/RTCs 打开栈帧运行时查错,包括:1. 初始化局部变量为非0值。在debug下使用,VC2005下用0xc来填充字节。2. 检测局部变量的上下限是否越界,例如数组。但是在结构体里面是不会有该检 测。3.栈指针的验证。验证栈指针是否正确,例如_stdcall的函数被当做_cdecl来使用。/RTCu 使用未初始化的变量时,抛出异常。/Wp64在64位编译器上检测用_w64修饰的变量的可移植性。在VC-32编译器上该参数默认关闭,在VC-64编译器上默认打开。_w64仅能修饰int long pointer类型的变量。当打开检测时,在数据传递时,会检测是否有数据丢失。/Yd已过期。当使用了参数/Yc /Z7时,将完整的调试信息保存在obj文件中。该参数已过期,VC2005支持多个object写入到一个pdb文件中,使用/Zi来代替该参数。除非需要在lib中加入调试信息,否则不要使用/Z7和/Yd的组合,而使用/Zi代替。/YI当使用预编译头创建调试版library失败时使用。/YIsymbol symbol将任意的symbol存在object模块中。当使用/Yc和/YIsymbol变异模块的时候,编译器会创建一个形如_PchSym_00.symbol的symbol存储在object模块中,是连接器产生的字符串。使用该参数有可能会产生LINK1211错误。当使用/Yc和/YIsymbol产生包含预编译头的library,并且在其他模块中使用该library,如果在目标模块中没有使用library中定义的任何函数时,则会引发该错误。/Z选择创建调试信息的类型。/Z不产生任何调试信息。在该参数下编译速度会有所提升。/Z7生成包含所有调试信息符号的obj文件。不产生pdb文件。在该调试信息中包含了变量及函数的名称和类型还有行号。/Zi 生成程序数据库(pdb)文件,其中包含了各种调试信息,包括变量函数的名称和类型,行号。/Gm(打开最小重编译)和/Zi可同时使用,但是不可和/Z7同时使用。(见/Gm)/ZI生成如上所述的程序数据库文件,并且支持调试中修改。如果要使用调试中修改则使用该选项,该选项会屏蔽所有的#pragma optimize语句。并且会打开/Gy。/ZI和/clr不能同时使用。/ZI只能在x86中使用,不能用于x64和Itanium处理器系列。/Zx关闭某些优化(if-conversions,software pipelining and global scheduling optimizations),使得程序可调式。该选项仅在Itanium编译器下有效。预编译选项:/AI指定#using的搜索路径。/AIdirectory/C预编译时保留注释。该选项需要/E,/P,/EP。/D定义预编译符号。可以使用#if #ifdef来配合该符号进行代码控制。预编译符号在功能上相当于宏(#define)。/D会忽略引号,而#define不会。默认定义的符号值为1。/DTEST 相当于/DTEST=1。/E将预编译结果输出到标准输出中。和/C组合可以保留注释。例如程序:#include /main function.#define HELLOWORLD hello world!int main()printf(HELLOWORLD);return 0;用cl /E /C main.cpp main.bak.cpp则可以保留注释,并且将预编译结果输出到main.bak.cpp中。编译后则输出:stdio.h头文件/main main()printf(hello world!);return 0;宏定义已经被替换。/EP同/E,但是会省略#line。当/EP和/E同时存在时,无论出现的顺序,默认使用/EP。/FI指定预处理头文件。效果相当于使用#include “xxx.h”。/FU显示指定#using文件。 /FUfile 如果有多个文件需要指定,则需多个/FU。/I添加一个Include文件搜索路径。 /I directory,如需指定多个路径,则需多个/I。/P预编译C,C+代码并且输出到文件中。输出文件与源文件同名,后缀名为.i。在预编译文件中保留#line,若需要删除#line则使用/EP组合。/U取消定义的符号,/U symbol取消之前用/D定义的符号。/u取消所有定义的符号。以上两个选项都不能取消#define定义的符号。以上两个选项均可取消以下符号:SymbolFunction_CHAR_UNSIGNED默认char类型为符号型,当使用/J时定义。_CPPRTTI当使用/GR时定义。_CPPUNWIND当使用/EHsc时定义。_DLL当使用/MD时定义。_M_IX86值为600,在x86处理器上默认定义。_MSC_VER编译器版本4个数字组成,默认定义。VS2005为1400。_WIN32当工程为Win32程序时,默认定义。_MT当使用/MD或者/MT时定义。/X取消标准路径搜索。编译器在编译时,从环境变量中的PATH和INCLUDE指定的路径中搜索include文件。使用该选项后则取消从环境变量PATH和INCLUDE中进行搜索。仅从/I 指定的路径搜索。语言选项:/openmp打开#pragma omp,使得编译器处理该语句。/vd/vd支持早期VC中一些不正确的行为。而这些行为已经不再需要。/vmb类成员指针表现方式。如果类定义总是在类成员指针定义之前,则使用/vmb/vmg类成员指针表现方式。如果类成员指针定义在类定义之前,则使用/vmg如果两个类相互引用对方的指针,则需要/vmg/vmm当使用/vmb,/vmg时使用,这些选项指定了在/vmg情况下,未定义类的继承类型。/vms当使用/vmb,/vmg时使用,这些选项指定了在/vmg情况下,未定义类的继承类型。/vmv当使用/vmb,/vmg时使用,这些选项指定了在/vmg情况下,未定义类的继承类型。/vmm多继承,默认未定义类为多继承,若此时未定义类为虚继承,编译器报错。/vms单继承,默认未定义类为单继承,若此时未定义类为多继承或虚继承,编译器报错。/vmv虚继承,默认未定义类为虚继承,编译器不会报错,该参数为默认参数。注意:一旦指定了继承类型选项,则该模块中所有的成员变量指针都使用该选项,无论他们指向的类的真实继承类型和指针是否定义在类定义之前。如果指定了/vms则会减少代码的大小,如果想更加通用则使用/vmv,但是它将会产生最大的代码。/Za关闭微软对C/C+特性的扩充。/Ze打开微软对C/C+特性的扩充。已过期,默认开打。微软对C/C+的扩充举例:1. 常量静态整形(枚举)类成员的初始化微软扩充,可在类声明中为这类变量赋初值。class CMyClass static const int max = 5;/声明时,赋初值 int m_arraymax;const int CMyClass:max; / 成员定义而在标准中,应该这样来定义:_declspec(selectany) const int CMyClass:max = 5;2. 类型转换:编译器支持以下两种类型转换:char *p;(int*)p)+;而标准C中只能:p = (char *)(int *)p+1);int (* pfunc)();int * pdata;pdata = (int *)pfunc;而标准C中则需要先把函数指针转换为intpdata = (int *) (int)pfunc;3. 变长参数列表编译器支持函数声明时,指定1个参数后,可省略剩下参数,剩下参数类型在函数定义时指出。void myfunc( int x, . );void myfunc( int x, char * c ,float f) 4. 单行注释在C语言中支持单行注释/ This is a single-line comment.等等/Zg已过期。生成函数原型。为所有函数生成函数原型。若函数参数中有结构体,枚举,联合体,或者指向他们饿指针时,需要定义tag name才能使用/Zg 例如:/ Zg_compiler_option.c/ compile with: /Zgtypedef struct MyStruct int i; T2; / MyStruct is the tag name.void f2(T2 * t) /Zll是L的小写。取消默认运行库名。编译时会将默认C运行库名装入obj文件。取消默认运行库名仅仅能节省少量空间。例如程序:int main()printf(“hello world“);在没有include任何头文件的情况下也可以编译通过,但是使用了/Zl,忽略了默认的运行库名,在链接的时候会报printf没有实现的错误。/Zp指定结构体成员的内存对齐方式。/Zp1 1字节对齐。和/Zp一致/Zp2 2字节对齐。/Zp4 4字节对齐。/Zp8 8字节对齐。默认值。/Zp1616字节对齐。/Zs拼写错误检查。使用该选项后不会有输出文件,仅仅检查源代码的拼写错误,并把错误提示输出到标准输出设备。拼写错误一般是关键字错误,函数名错误(未定义函数)。链接选项:/F设置栈大小。设置程序栈的大小,默认1MB。链接器会修改指定的值,使之为4字节的倍数。/LDd创建一个DLL文件。连接器会查找DllMain函数,但是该函数不是必须的,如果程序中没有该函数,连接器会插入一个返回TRUE的空 DllMain函数。如果没有指定导出文件(*.exp)那么编译器会生成一个导入库(*.lib),可以在其他程序中通过该lib来调用DLL。/LN创建MSIL模块(创建托管程序,使用.net)。默认/LN是无效的,当使用/LN时,必须指定/clr选项。/link传递链接选项。把链接选项传递给LINKER(link.exe)。后面可跟多个连接选项。/link和后面的链接选项必须放在源代码文件名和CL选项的后面。/link和链接选项之间必须有一个空格。/MDd使用multi-thread- 和DLL-specific 版本的运行库。在IDE下面使用宏 _MT和 _DLL就会产生该编译条件。会在obj文件里面使用MSVCRT.lib /MDd 采用debug版本的 MSVCTRD.lib当该参数与 /D_STATIC_CPPLIB配合使用时,编译器会使用libcpmt.lib来代替msvcprt.lib进行链接。动态链接,需要msvcr80.dll / msvcr80d.dll/MTd 使用multithread static版本的运行库。采用 libcmt.lib进行链接。程序运行不需要额外的运行库。/MTd 使用libcmtd.lib进行链接。如果在命令行中没有加上/MD参数 则默认使用/MT。从VC8开始则不再使用/MLd参数,取消了single-thread的运行库。注意:其中/MD 和/MT是不能同时存在的,如果在命令提示行中同时出现了这个两个参数,则以后出现的为准。预编译头选项:/Y-忽略其它预编译头选项。(不可被覆盖,当/Yc出现在/Y-后面时,仍然会忽略掉/Yc)/Yc创建预编译头文件。.pch。/Ycfilename指定预编译头(.h)。一旦指定该头文件.h。则所有的源文件都需要包含该头文件。/Yd已过期。将调试信息装入object文件。需要和/Yc,/Z7同时使用。使用/Zi代替/Yd。/Yu使用预编译头文件。在编译过程中使用指定的预编译头文件。/Yufilename指定头文件。在编译过程中,使用该头文件产生的预编译头文件。注:/Yc仅仅是为.h文件产生一个.pch文件。/Yu是使用.h对应的.pch文件。其他选项:指定附加文件。当使用windows95,98,98SE,ME操作系统时,cmd参数只能输入127个字符。当编译命令较长时,需要附加文件来存储命令。用指定该文件。/?列出编译器参数输出到标准输出设备。同 /HELP /help。/analyze代码分析选项。打开代码分析。该选项仅在x86的企业版中有效。(team development)/c仅编译,不链接。/doc处理源代码中的文档。/docname,为每个源代码文件创建在.xdc文件并保存其中的文档。只有当编译单个源代码文件时,name参数才有效。/errorReport: /errorReport:none 关于编译器内部错误的报告不会被收集发送。/errorReport:prompt 当发生编译器内部错误时,提示用户是否收集并发送至微软。/errorReprot:queue 将编译器内部错误报告放入队列中,当用户下次以管理员权限 登录时提示用户是否发送。该选项是命令行编译的默认选项。/errorReport:send 自动发送编译器内部错误报告。/FC在诊断信息中输出源代码文件的完整路径。例如编译以下程序:/file: compiler_option_FC.cpp int main( ) int i / C2143在没有使用/FC输出以下诊断信息:compiler_option_FC.cpp(5) : error C2143: syntax error : missing ; before 而使用/FC选项后则输出:c:testcompiler_option_FC.cpp(5) : error C2143: syntax error : missing ; before 当使用_FILE_宏时,需要指定该选项。/H指定标识符长度。标识符长度默认为2047。最大为2047,超过该长度编译器报错。若指定的标识符长度小于2047,在程序中出现超过指定的长度标识符时,编译器会截断标识符。/HELP列出编译器参数输出到标准输出设备。同 /? /help。/hotpatch/hotpatch 用于编译时,编译器确保每个函数的第一个指令为两个字节,这是热修补的要求。使用 /hotpatch 进行编译之后,必须使用 /FUNCTIONPADMIN(创建可热修补的映像)进行链接,这将完成使映像可热修补的准备过程。通过单独调用 cl.exe 编译和链接映像时,/hotpatch 表示 /functionpadmin。生成将在

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论