微软C/C++/C#编译器命令行模式设定和用法微软C/C++/C#编译器命令行模式设定和用法和在IDE中编译相比,命令行模式编译速度更快,并可以避免被IDE产生的一些附加信息所干扰。
本文将介绍微软C/C++/C#编译器命令行模式设定和用法。
操作系统为Windows 2000 。
一.微软C/C++编译器命令行模式设定方法一1.参照如下内容(根据你的系统情况,作出相应修改),编写一个批处理文件,假定命名为vs.bat。
@echo offset PATH=C:\WINNT\SYSTEM32;D:\\VC7\BIN;D:\\COMMON7\IDEset INCLUDE=D:\\VC7\INCLUDEset LIB=D:\\VC7\LIB说明:a.以上各环境变量字符串大小写无所谓,但字符之间应避免出现空格。
b.之所以加上C:\WINNT\SYSTEM32,目的是为了便于使用help之类的扩展命令,和本讨论主题并无直接关系。
2.打开一个“命令提示符”窗口,执行如下命令:C:\>start c:\vc7.bat (根据你的文件路径,作出相应修改)即会创建一个新的“命令提示符”窗口,在这个窗口内,便可进行C++程序编译工作。
具体用法,后面再说。
这种设置方法的缺点在于,只能在步骤2新创建的“命令提示符”窗口里进行编译,一旦关闭该窗口,即需要重新执行步骤2。
方法二1.在桌面“我的电脑”图标上,单击右键,然后执行“属性”菜单命令,或者,依照“开始”-“设置”-“控制面板”步骤,双击“系统”图标,都会弹出“系统特性”对话框。
选中“高级”页面,点击“环境变量”按钮,即会出现图1所示的环境变量设置窗口。
(说明:任何用户都可以增/删/改用户环境变量,但只有管理员才能增/删/改系统环境变量。
对于特定计算机的每个用户来说,用户环境变量可以不相同)图12.你可以设置为用户环境变量,也可以设置为系统环境变量。
参考以下内容,并参见图2所示界面。
(根据你系统的情况,作出相应调整)PATH=C:\WINNT\SYSTEM32;D:\\VC7\BIN;D:\\COMMON7\IDEINCLUDE=D:\\VC7\INCLUDELIB=D:\\VC7\LIB图2和方法一不同的是,采用这种方式,一旦设置完毕,便可一劳永逸。
无需重新启动计算机,现在就打开一个“命令提示符”窗口,执行cl命令试试。
说明:假如你的操作系统是Windows 95/98,可以参照上面描述,直接编辑autoexec.bat文件。
二.Visual C# .NET编译器命令行模式设定C#编译器命令行模式设定方法大同小异,具体不再赘述,只需在PATH后面加上C:\WINNT\\FRAMEWORK\如下:PATH=C:\WINNT\SYSTEM32;D:\\VC7\BIN;D:\\COMMON7\IDE;C:\WINNT\MICRO \FRAMEWORK\;D:\\FRAMEWORKSDK\BIN;D:\BCC55\BIN;E:\ORACLE\ORA81\BIN三.微软C/C++编译器命令行模式用法微软C/C++编译器编译选项数目众多,在“命令提示符”窗口键入cl /?即可查看完整列表(见附录1)。
比如说,/GX启用C++异常处理机制,/GR启用C++ RTTI,等等。
在此不打算详细讨论这些编译选项用法。
以下是我的测试目录f:\vstest中的一个样例文件://1.cpp#include <iostream>using namespace std;void main(){cout << "Hello Royal"<<endl;}你现在可以进入该目录执行如下编译命令:F:\vstest>cl /GX 1.cpp运行程序,即会产生如下输出:Hello Royal编译多个文件也很简单,参见下面例子://2.cpp#include <iostream>#include "3.cpp"using namespace std;void main(){CTest ct("Hello ");cout << ct.str << endl;}//3.cpp#include <string>using namespace std;class CTest{public:CTest(string strValue): str(strValue){}string str;};执行如下编译命令即可:F:\vstest>cl /GX 2.cpp 3.cpp也可以这样编译,以指定生成的exe名字:F:\vstest>cl /GX /FeHello.exe 2.cpp 3.cpp (生成Hello.exe)运行程序,输出结果如下:Hello四.Visual C# .NET编译器命令行模式用法在“命令提示符”窗口键入csc /?即可查看完整编译选项列表(见附录2)。
在此不打算详细讨论这些编译选项用法。
不过,要说明的是,你之所以无需使用/r:编译选项引用相关库文件,就可以编译绝大多数程序,原因在于C#编译器默认引用了mscorlib.dll以及csc.rsp文件中指定的程序库。
该文件内容如下:# This file contains command-line options that the C## command line compiler (CSC) will process as part# of every compilation, unless the "/noconfig" option# is specified.# Reference the common Framework libraries/r:Accessibility.dll/r:/r:/r:/r:/r:/r:System.dll/r:/r:/r:/r:/r:/r:/r:/r:/r:/r:/r:/r:/r:/r:可见,它引用了许多.NET标准库,假如没有充足的理由,就不要修改这个配置文件!但我修改了我机器上的csc.rsp文件,它的尾部多了这两行:#NUnit is a unit-testing framework for all .Net languages/r:d:\Nunitv2.0\bin\注意,文件路径中不可有空格。
例如,Nunit2.0默认安装主目录为Nuint v2.0,假如不做必要的更改(我改成了Nunitv2.0),将无法成功引用,并将导致整个csc命令行编译器无法使用,小心!假如要取消对mscorlib.dll或csc.rsp引用的话,可以使用/nostdlib或/noconfig编译选项。
以下是我的测试目录f:\vstest中的一个样例文件://4.csusing System;namespace _4{class Class1{[STAThread]static void Main(string[] args){Console.WriteLine("Hello Royal");}}}执行如下编译命令:F:\vstest>csc 4.cs运行程序,即输出:Hello Royal以下是编译多个文件的例子://5.csusing System;using _6;namespace _5{class Class5{[STAThread]static void Main(string[] args){Class6 c6 = new Class6("Hello ");Console.WriteLine(c6.str);}}}//6.csusing System;namespace _6{class Class6{public Class6(string strValue) {str = strValue;} public string str;}}执行如下编译命令:F:\vstest>csc 5.cs 6.cs也可以这样编译,以指定生成的exe文件名字:F:\vstest>csc /out:Hello.exe 5.cs 6.cs运行程序,即会输出如下字样:Hello附录一(更详细信息,可查阅MSDN)微软C/C++ 编译器选项-优化-/O1最小化空间/Op[-]改善浮点数一致性/O2最大化速度/Os优选代码空间/Oa假设没有别名/Ot优选代码速度/Ob<n>内联展开(默认 n=0)/Ow假设交叉函数别名/Od禁用优化(默认值)/Ox最大化选项。
(/Ogityb2 /Gs) /Og启用全局优化/Oy[-]启用框架指针省略/Oi启用内部函数-代码生成-/G3为 80386 进行优化/GH启用 _pexit 函数调用/G4为 80486 进行优化/GR[-]启用 C++ RTTI/G5为 Pentium 进行优化/GX[-]启用 C++ EH(与 /EHsc 相同)/G6为 PPro、P-II、P-III 进行优化/EHs启用 C++ EH(无 SEH 异常)/GB为混合模型进行优化(默认)/EHa启用 C++ EH(w/ SEH 异常)/Gd__cdecl 调用约定/EHc外部“C”默认为 nothrow/Gr__fastcall 调用约定/GT生成纤维安全 TLS 访问/Gz__stdcall 调用约定/Gm[-]启用最小重新生成/GA为 Windows 应用程序进行优化/GL[-]启用链接时代码生成/Gf启用字符串池/QIfdiv[-]启用 Pentium FDIV 修复/GF启用只读字符串池/QI0f[-]启用 Pentium 0x0f 修复/Gy分隔链接器函数/QIfist[-]使用 FIST 而不是 ftol()/GZ启用堆栈检查 (/RTCs)/RTC1启用快速检查 (/RTCsu)/Ge对所有函数强制堆栈检查/RTCc转换为较小的类型检查/Gs[num]控制堆栈检查调用/RTCs堆栈帧运行时检查/GS启用安全检查/RTCu未初始化的本地用法检查/Gh启用 _penter 函数调用/clr[:noAssembly]为公共语言运行时库编译noAssembly - 不产生程序集-输出文件-/Fa[file]命名程序集列表文件/Fo<file>命名对象文件/FA[sc]配置程序集列表/Fp<file>命名预编译头文件/Fd[file]命名 .PDB 文件/Fr[file]命名源浏览器文件/Fe<file>命名可执行文件/FR[file]命名扩展 .SBR 文件/Fm[file]命名映射文件-预处理器-/AI<dir>添加到程序集搜索路径/Fx将插入的代码合并到文件/FU<file>强制使用程序集/模块/FI<file>命名强制包含文件/C不抽出注释/U<name>移除预定义宏/D<name>{=|#}<text>定义宏/u移除所有预定义宏/E预处理到 stdout/I<dir>添加到包含搜索路径/EP预处理到 stdout,没有 #line /X忽略“标准位置”/P预处理到文件-语言-/Zi启用调试信息/Zl忽略 .OBJ 中的默认库名/ZI启用“编辑并继续”调试信息/Zg生成函数原型/Z7启用旧式调试信息/Zs只进行语法检查/Zd仅有行号调试信息/vd{0|1}禁用/启用 vtordisp/Zp[n]在 n 字节边界上包装结构/vm<x>指向成员的指针类型/Za禁用扩展(暗指 /Op)/noBool禁用“bool”关键字/Ze启用扩展(默认)/Zc:arg1[,arg2]C++ 语言一致性,这里的参数可以是:forScope - 对范围规则强制使用标准 C++;wchar_t - wchar_t 是本机类型,不是 typedef- 杂项 -@<file>选项响应文件/wo<n>发出一次警告 n/?, /help打印此帮助消息/w<l><n>为 n 设置警告等级 1-4/c只编译,不链接/W<n>设置警告等级(默认 n=1)/H<num>最大外部名称长度/Wall启用所有警告/J默认 char 类型是 unsigned /Wp64启用 64 位端口定位警告/nologo取消显示版权消息/WX将警告视为错误/showIncludes显示包含文件名/WL启用单行诊断/Tc<source file>将文件编译为 .c/Yc[file]创建 .PCH 文件/Tp<source file>将文件编译为 .cpp/Yd将调试信息放在每个 .OBJ 中/TC将所有文件编译为 .c/Yl[sym]为调试库插入 .PCH 引用/TP将所有文件编译为 .cpp/Yu[file]使用 .PCH 文件/V<string>设置版本字符串/YX[file]自动 .PCH/w禁用所有警告/Y-禁用所有 PCH 选项/wd<n>禁用警告 n/Zm<n>最大内存分配(默认为 %)/we<n>将警告 n 视为错误-链接-/MD与 MSVCRT.LIB 链接/MDd与 MSVCRTD.LIB 调试库链接/ML与 LIBC.LIB 链接/MLd与 LIBCD.LIB 调试库链接/MT与 LIBCMT.LIB 链接/MTd与 LIBCMTD.LIB 调试库链接/LD创建 .DLL/F<num>设置堆栈大小/LDd创建 .DLL 调试库/link[链接器选项和库]附录二(更详细信息,可查阅MSDN)Visual C# .NET 编译器选项- 输出文件 -/out:<文件>输出文件名(默认值:包含主类的文件或第一个文件的基名称)/target:exe生成控制台可执行文件(默认) (缩写: /t:exe)/target:winexe生成 Windows 可执行文件 (缩写: /t:winexe)/target:library生成库 (缩写: /t:library)/target:module生成能添加到其他程序集的模块 (缩写: /t:module)/define:<符号列表>定义条件编译符号 (缩写: /d)/doc:<文件>要生成的 XML 文档文件- 输入文件 -/recurse:<通配符>根据通配符规范,包括当前目录和子目录下的所有文件/reference:<文件列表>从指定的程序集文件引用元数据 (缩写: /r)/addmodule:<文件列表>将指定的模块链接到此程序集中- 资源 -/win32res:<文件>指定 Win32 资源文件 (.res)/win32icon:<文件>使用该图标输出/resource:<资源信息>嵌入指定的资源 (缩写: /res)/linkresource:<资源信息>将指定的资源链接到此程序集中 (缩写: /linkres)- 代码生成 -/debug[+|-]发出调试信息/debug:{full|pdbonly}指定调试类型(“full”是默认类型,可以将调试程序附加到正在运行的程序)/optimize[+|-]启用优化 (缩写: /o)/incremental[+|-]启用增量编译 (缩写: /incr)- 错误和警告 -/warnaserror[+|-]将警告视为错误/warn:<n>设置警告等级 (0-4) (缩写: /w)/nowarn:<警告列表>禁用特定的警告消息- 语言 -/checked[+|-]生成溢出检查/unsafe[+|-]允许“不安全”代码- 杂项 -@<文件>读取响应文件以获得更多选项/help显示此用法信息 (缩写: /?)/nologo取消编译器版权信息/noconfig不要自动包含 CSC.RSP 文件- 高级 -/baseaddress:<地址>要生成的库的基址/bugreport:<文件>创建一个“错误报告”文件/codepage:<n>指定打开源文件时要使用的代码页/utf8outputUTF-8 编码的输出编译器消息/main:<类型>指定包含入口点的类型(忽略所有其他可能的入口点) (缩写: /m) /fullpaths编译器生成完全限定路径/filealign:<n>指定用于输出文件节的对齐方式/nostdlib[+|-]不引用标准库 (mscorlib.dll)/lib:<文件列表>指定要在其中搜索引用的附加目录。