微软C/C++/C#编译器命令行模式设定和用法 荣耀 2002冬 和在IDE中编译相比,命令行模式编译速度更快,并可以避免被IDE产生的一些附加信息所干扰。本文将介绍微软C/C++/C#编译器命令行模式设定和用法。操作系统为Windows 2000。 一.微软C/C++编译器命令行模式设定 方法一 1. 参照如下内容(根据你的系统情况,作出相应修改),编写一个批处理文件,假定命名为vs.bat。 @echo off set PATH=C:\WINNT\SYSTEM32;D:\VS.NET\VC7\BIN;D:\VS.NET\COMMON7\IDE set INCLUDE=D:\VS.NET\VC7\INCLUDE set LIB=D:\VS.NET\VC7\LIB 说明: a. 以上各环境变量字符串大小写无所谓,但字符之间应避免出现空格。 b. 之所以加上C:\WINNT\SYSTEM32,目的是为了便于使用help之类的扩展命令,和本讨论主题并无直接关系。 2. 打开一个“命令提示符”窗口,执行如下命令: C:\>start c:\vc7.bat (根据你的文件路径,作出相应修改) 即会创建一个新的“命令提示符”窗口,在这个窗口内,便可进行C++程序编译工作。具体用法,后面再说。 这种设置方法的缺点在于,只能在步骤2新创建的“命令提示符”窗口里进行编译,一旦关闭该窗口,即需要重新执行步骤2。 方法二 1. 在桌面“我的电脑”图标上,单击右键,然后执行“属性”菜单命令,或者,依照“开始”-“设置”-“控制面板”步骤,双击“系统”图标,都会弹出“系统特性”对话框。 选中“高级”页面,点击“环境变量”按钮,即会出现图1所示的环境变量设置窗口。(说明:任何用户都可以增/删/改用户环境变量,但只有管理员才能增/删/改系统环境变量。对于特定计算机的每个用户来说,用户环境变量可以不相同) 
图1 2. 你可以设置为用户环境变量,也可以设置为系统环境变量。参考以下内容,并参见图2所示界面。(根据你系统的情况,作出相应调整) PATH=C:\WINNT\SYSTEM32;D:\VS.NET\VC7\BIN;D:\VS.NET\COMMON7\IDE INCLUDE=D:\VS.NET\VC7\INCLUDE LIB=D:\VS.NET\VC7\LIB 
图2 和方法一不同的是,采用这种方式,一旦设置完毕,便可一劳永逸。无需重新启动计算机,现在就打开一个“命令提示符”窗口,执行cl命令试试。 说明:假如你的操作系统是Windows 95/98,可以参照上面描述,直接编辑autoexec.bat文件。 二.Visual C# .NET编译器命令行模式设定 C#编译器命令行模式设定方法大同小异,具体不再赘述,只需在PATH后面加上C:\WINNT\MICROSOFT.NET\FRAMEWORK\V1.0.3705即可。目前我的机器上PATH环境变量设置如下: PATH=C:\WINNT\SYSTEM32;D:\VS.NET\VC7\BIN;D:\VS.NET\COMMON7\IDE;C:\WINNT\MICROSOFT.NET\FRAMEWORK\V1.0.3705;D:\VS.NET\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 www.royaloo.com"); 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 www.royaloo.com 四.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:Microsoft.Vsa.dll /r:System.Configuration.Install.dll /r:System.Data.dll /r:System.Design.dll /r:System.DirectoryServices.dll /r:System.dll /r:System.Drawing.Design.dll /r:System.Drawing.dll /r:System.EnterpriseServices.dll /r:System.Management.dll /r:System.Messaging.dll /r:System.Runtime.Remoting.dll /r:System.Runtime.Serialization.Formatters.Soap.dll /r:System.Security.dll /r:System.ServiceProcess.dll /r:System.Web.dll /r:System.Web.RegularExpressions.dll /r:System.Web.Services.dll /r:System.Windows.Forms.Dll /r:System.XML.dll 可见,它引用了许多.NET标准库,假如没有充足的理由,就不要修改这个配置文件! 但我修改了我机器上的csc.rsp文件,它的尾部多了这两行: #NUnit is a unit-testing framework for all .Net languages /r:d:\Nunitv2.0\bin\nunit.framework.dll 注意,文件路径中不可有空格。例如,Nunit2.0默认安装主目录为Nuint v2.0,假如不做必要的更改(我改成了Nunitv2.0),将无法成功引用nunit.framework.dll,并将导致整个csc命令行编译器无法使用,小心! 假如要取消对mscorlib.dll或csc.rsp引用的话,可以使用/nostdlib或/noconfig编译选项。 以下是我的测试目录f:\vstest中的一个样例文件: //4.cs using System; namespace _4 { class Class1 { [STAThread] static void Main(string[] args) { Console.WriteLine("Hello Royal"); } } } 执行如下编译命令: F:\vstest>csc 4.cs 运行程序,即输出: Hello Royal 以下是编译多个文件的例子: //5.cs using System; using _6; namespace _5 { class Class5 { [STAThread] static void Main(string[] args) { Class6 c6 = new Class6("Hello www.royaloo.com"); Console.WriteLine(c6.str); } } } //6.cs using 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 www.royaloo.com 附录一(更详细信息,可查阅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] | |
|