微軟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:/W
INNT/MICROSOFT.NET/FRAMEWORK/V1.0.3705即可。目前我的機器上PATH環境變數設定
如下:
PATH=C:/WINNT/SYSTEM32;D:/VS.NET/VC7/BIN;D:/VS.NET/COMMON7/IDE;C:/WINNT/MICRO
SOFT.NET/FRAMEWORK/V1.0.3705;D:/VS.NET/FRAMEWORKSDK/BIN;D:/BCC55/BIN;E:/ORACL
E/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
命名程式集列表檔案
/Fo<file>
命名物件檔案
/FA[sc]
配置程式集列表
/Fp<file>
命名先行編譯標頭檔
/Fd
命名 .PDB 檔案
/Fr
命名源瀏覽器檔案
/Fe<file>
命名可執行檔
/FR
命名擴充 .SBR 檔案
/Fm
命名對應檔
-前置處理器-
/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
建立 .PCH 檔案
/Tp<source file>
將檔案編譯為 .cpp
/Yd
將調試資訊放在每個 .OBJ 中
/TC
將所有檔案編譯為 .c
/Yl[sym]
為調試庫插入 .PCH 引用
/TP
將所有檔案編譯為 .cpp
/Yu
使用 .PCH 檔案
/V<string>
設定版本字串
/YX
自動 .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:<檔案清單>
指定要在其中搜尋引用的附加目錄