1. 程式人生 > >常用cl編譯命令參數解釋

常用cl編譯命令參數解釋

文件依賴 scope 也不能 不知道 x86 介紹 tle .idb pla

緊接前文,第一行cl命令如下:

[plain] view plain copy print?
  1. 1> cl /c /IC:\...\include /ZI /nologo- /W3 /WX- /sdl /Od /Oy- /D WIN32 /D _DEBUG /D _CONSOLE /D _UNICODE /D UNICODE /Gm /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Yc"stdafx.h" /Fp"Debug\HelloWorld.pch" /Fo"Debug\\" /Fd"Debug\vc110.pdb" /Gd /TP /analyze- /errorReport:prompt stdafx.cpp
  2. 1>cl : Command line warning D9035: option ‘nologo-‘ has been deprecated and will be removed in a future release

找到了MSDN的文檔:

http://msdn.microsoft.com/en-us/library/vstudio/9s7c9wdw.aspx

也可以在Developer Command Prompt for VS2012終端窗口中輸入cl /? 獲得幫助信息。


/c 代表只編譯不鏈接。

/I 指定頭文件的目錄

/C 在編譯期間保留代碼註釋,這裏和/I連在一起使用,/IC

首先介紹一個概念,VC中有個PDB文件,全稱是Program Database,用來存放程序信息的小的數據庫文件。

編譯Debug版本時,調試信息需要保留,我們可以選擇直接將調試信息寫到.obj文件中,或者存到.pdb文件中。

/Z7 不產生.pdb文件,將所有調試信息存入.obj文件中

/Zi和/ZI 都產生.pdb文件,不過/ZI支持"編輯繼續調試"功能, (the edit and continue feature), 看上去更酷,但是我從來沒有用過這個功能。

/ZI有一些邊際效應,會禁止#pragma optmize 指令,也不能和/clr一起用。

/nologo- 已經無效,自己生成命令行的時候,沒必要用了。

/W3 也中警告級別,VC提供了很多警告級別,參考http://msdn.microsoft.com/en-us/library/vstudio/thxezb7y.aspx

自己編譯的話,直接用/Wall最好。

/WX- 不太明白為什麽有 - 號,(估計是和:NO的意思相同,也就是不啟用該功能), /WX的意思是將warning轉變成error,這樣強迫消除所有的warning,如果和/Wall一起使用,那是最好的。

/sdl 是對代碼進行安全檢查,如果發現相關警告,轉變成錯誤輸出

/Od 禁止優化

/Oy- 禁止該選項,該選項如果沒有 - 號,則會在x86上編譯時忽略frame-pointer,起到加速程序的作用。 frame-pointer,我暫時不知道是啥。

/D 預處理定義,後面可以跟不同的參數都是宏啊,比如

[plain] view plain copy print?
  1. /D WIN32 /D _DEBUG /D _CONSOLE /D _UNICODE /D UNICODE


/Gm 啟用最小化重新編譯, VC用.idb保留了上次編譯的緩存信息,包括文件依賴關系。下次編譯時可以使用.idb文件用來檢查,跳過不需要重新編譯的文件。

/EH 異常處理模式,後面可以接一些參數:http://msdn.microsoft.com/en-us/library/vstudio/1deeycx5.aspx

通常都用/EHsc

/RTC 運行時錯誤檢查,參考:http://msdn.microsoft.com/en-us/library/vstudio/8wtf2dfz.aspx

/MDd 和上面一個都很重要,使用Debug版本的多線程運行時動態庫,參考:http://msdn.microsoft.com/en-us/library/vstudio/2kzt1wy3.aspx

/GS 緩沖區安全檢查

看到這裏,發現cl其實參數很多很多,VC提供了默認的選項,一般都夠用。不過仔細分析一下,還是能夠對cl的特性了解不少,對於提高編譯器的認識還是很有好處的。

/fp:precise 是和浮點數相關,參考:http://msdn.microsoft.com/en-us/library/vstudio/e7s85ffb.aspx

/Zc:wchar_t 指定wchar_t是native type,我現在還不不清楚有什麽作用。

/Zc:forScope用/Ze來實現標準C++的for循環, /Ze已經被廢除,所以這個選項似乎沒什麽意義。

/Yc "stdafx.h" 制定stdafx.h為預編譯頭文件

/Fp"Debug\HelloWorld.pch" 指定預編譯文件, 這樣staafx.h編譯出的內容放在HelloWorld.pch中,可以大大提高編譯速度。因為VC中的預編譯文件很大,每次重新編譯很耗時。

/Fo"Debug\\" 指定.obj文件存放在Debug目錄下

/Fd"Debug\vc110.pdb" 指定pdb文件路徑,pdb前面已經介紹過了。

/Gd 僅用於x86平臺。如果C++函數沒有顯示指定__stdcall或者__fastcall,就采用__cdecl

/Tp 指定C++源文件

/analyze- 這是關閉代碼分析功能

/errorReport:prompt 提示內部錯誤信息

以上是編譯用的參數解釋。後面還會看一下鏈接用的參數。

http://blog.csdn.net/csfreebird/article/details/9769905

常用cl編譯命令參數解釋