首页 > 代码库 > 微软C/C++/C#编译器命令行模式设定和用法

微软C/C++/C#编译器命令行模式设定和用法

和在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\MI
CROSOFT.NET\FRAMEWORK\V1.0.3705;D:\VS.NET\FRAMEWORKSDK\BIN;D:\BCC55\BIN;E:\ORA
CLE\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] 
 创建 .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> 
 指定打开源文件时要使用的代码页 
 
/utf8output 
 UTF-8 编码的输出编译器消息 
 
/main:<类型> 
 指定包含入口点的类型(忽略所有其他可能的入口点) (缩写: /m) 
 
/fullpaths 
 编译器生成完全限定路径 
 
/filealign:<n> 
 指定用于输出文件节的对齐方式 
 
/nostdlib[+|-] 
 不引用标准库 (mscorlib.dll) 
 
/lib:<文件列表> 
 指定要在其中搜索引用的附加目录 
 

-完-