VC++中cl.exe編譯器的使用

使用CL.EXE查看C++中類的內存結構

今天查資料的時候發現 VS 編譯器 CL 的一個編譯選項可以查看 C++ 類的內存佈局,非常有用。使用如下,從開始程序菜單找到 Visual Stdio 2008/2005 Command Prompt,選擇 VS 的命令行工具,按如下格式使用:

>cl –d1reportSingleClassLayout[classname]  test.cpp

而使用 –d1reportAllClassLayout 則可以查看源文件中所有類及結構體的內存佈局。

其中,classname 爲類名,-d1reportSingleClassLayout[classname] 之間沒有空格。編寫程序測試:

比較奇怪,加上 #include <iostream> 後,測試結構體的時候就會出現很輸出,應該是庫中的類,看起來真麻煩,所以這裏去掉它。


和在IDE中編譯相比,命令行模式編譯速度更快,並可以避免被IDE產生的一些附加信息所幹擾。本文將介紹微軟C/C++編譯器命令行模式設定和用法。

1、設置環境變量:

PATH=C:\Program Files\Microsoft Visual Studio 8\VC\bin

INCLUDE=C:\Program Files\Microsoft Visual Studio 8\VC\include

LIB=C:\Program Files\Microsoft Visual Studio 8\VC\lib

如果提示找不到mspdb80.dll文件,則從C:\Program Files\Microsoft Visual Studio 8\Common7\IDE下拷貝“msobj80.dll,mspdb80.dll,mspdbcore.dll,mspdbsrv.exe”這四個文件到C:\Program Files\Microsoft Visual Studio 8\VC\bin下即可。



2、命令選項:

1)       /C:在預處理輸出中保留註釋語句

2)       /c:只編譯,不連接,相當於在"Build"菜單下選擇了"Compile"

3)       /D:定義常量和宏,與源程序裏的#define 有相同效果

4)       /E:預處理C、C++源文件,將源文件中所有的預編譯指令及宏展開,將註釋去掉,然後將預處理器的輸出拷貝至標準輸出設備輸出,並且在每個文件的開頭和末尾加入#line

5)       /EH:指定編譯器用何種異常處理模型

6)       /EP:同/E,只是去掉了#line

7)       /F:設置程序的堆棧大小

8)       /FA:設置生成何種列表文件(彙編、彙編與機器碼、彙編與源碼、彙編與機器碼以及源碼)

9)       /Fa:指定用/FA設置的列表文件的存放路徑及(或)文件名

10) /FD:生成文件的相互依賴信息

11) /Fd:設置程序數據庫文件(PDB)的存放路徑及(或)文件名

12) /Fe:設置最終可執行文件的存放路徑及(或)文件名

13) /FI:預處理指定的頭文件,與源文件中的#include有相同效果

14) /Fm:創建map文件

15) /Fo:設置編譯後Obj文件的存放路徑及(或)文件名

16) /Fp:設置預編譯文件(pch)的存放路徑及(或)文件名

17) /FR:生成瀏覽信息(sbr)文件

18) /Fr:同/FR,不同之處在於/Fr不包括局部變量信息

19) /G3:爲80386處理器優化代碼生成

20) /G4:爲80486處理器優化代碼生成

21) /G5:爲Pentium處理器優化代碼生成

22) /G6:爲Pentium Pro處理器優化代碼生成

23) /GA:爲Windows應用程序作優化

24) /GB:爲Pentium處理器優化代碼生成,使用80386、80486、Pentium、Pentium Pro的混合指令集,是代碼生成的默認選項(程序屬性選項中Processor對應Blend)

25) /GD:爲Windows動態庫(dll)作優化,此開關在VC6中沒有實現

26) /Gd:指定使用__cdecl的函數調用規則

27) /Ge:激活堆棧檢測

28) /GF:消除程序中的重複的字符串,並將她放到只讀的緩衝區中

29) /Gf:消除程序中的重複字符串

30) /Gh:在每個函數的開頭調用鉤子(hook)函數--penter

31) /Gi:允許漸進編譯

32) /Gm:允許最小化rebuild

33) /GR:允許運行時類型信息(Run-Time Type Infomation)

34) /Gr:指定使用__fastcall的函數調用規則

35) /Gs:控制堆棧檢測所用內存大小

36) /GT:支持用__declspec(thread)分配的數據的fier-safety

37) /GX:允許同步異常處理,與/EHsc開關等價

38) /Gy:允許編譯器將每一個函數封裝成COMDATs的形式,供連接器調用

39) /GZ:允許在Debug build 的時候捕捉Release build的錯誤

40) /Gz:指定使用__stdcall的函數調用規則

41) /H:限制外部名字的長度

42) /HELP:列出編譯器的所有的命令開關

43) /I:指定頭文件的搜索路徑

44) /J:將char的缺省類型從signed char改成unsigned char

45) /LD:創建一個動態連接庫

46) /LDd:創建一個Debug版本的動態鏈接庫

47) /link:將指定的選項傳給連接器

48) /MD:選擇多線程、DLL版本的C Run-Time庫

49) /MDd:選擇多線程、DLL、Debug版本的C Run-Time庫

50) /ML:選擇單線程版本的C Run—Time庫

51) /MLd:選擇單線程、Debug版本的C Run—Time庫

52) /MT:選擇多線程版本的C Run-Time庫

53) /MTd:選擇多線程、Debug版本的C Run—Time庫

54) /nologo:不顯示程序的版權信息

55) /O1:優化使產生的可執行代碼最小

56) /O2:優化使產生的可執行代碼速度最快

57) /Oa:指示編譯器程序裏沒有使用別名,可以提高程序的執行速度

58) /Ob:控制內聯(inline)函數的展開

59) /Od:禁止代碼優化

60) /Og:使用全局優化

61) /Oi:用內部函數去代替程序裏的函數調用,可以使程序運行的更快,但程序的長度變長

62) /Op:提高浮點數比較運算的一致性

63) /Os:產生儘可能小的可執行代碼

64) /Ot:產生儘可能塊的可執行代碼

65) /Ow:指示編譯器在函數體內部沒有使用別名

66) /Ox:組合了幾個優化開關,達到儘可能多的優化

67) /Oy:阻止調用堆棧裏創建幀指針

68) /Q1f:對核心級的設備驅動程序生成單獨的調試信息

69) /QI0f:對Pentium 0x0f錯誤指令作修正

70) /Qifdiv:對Pentium FDIV錯誤指令作修正

71) /P:將預處理輸出寫到指定文件裏,文件的後綴名爲I

72) /TC:將命令行上的所有文件都當作C源程序編譯,不管後綴名是否爲.c

73) /Tc:將指定的文件當作C源程序編譯,不管後綴名是否爲.c

74) /TP:將命令行上的所有文件都當作C++源程序編譯,不管後綴名是否爲.cpp

75) /Tp:將指定文件當作C++源程序編譯,不管後綴名是否爲.cpp

76) /U:去掉一個指定的前面定義的符號或常量

77) /u:去掉所有前面定義的符號或常量

78) /V:在編譯的obj文件裏嵌入版本號

79) /vd:禁止/允許構造函數置換

80) /vmb:選擇指針的表示方法,使用這個開關,在聲明指向某個類的成員的指針之前,必須先定義這個類

81) /vmg:選擇指針的表示方法,使用這個開關,在聲明指向某個類的成員的指針之前,不必先定義這個類,但要首先指定這個類是使用何種繼承方法

82) /vmm:設置指針的表示方法爲Single Inheritance and Multiple Inheritance

83) /vms:設置指針的表示方法爲Single Inheritance

84) /vmv:設置指針的表示方法爲Any class

85) /W:設置警告等級

86) /w:禁止所有警告

87) /X:阻止編譯器搜索標準的include 目錄

88) /Yc:創建預編譯頭文件(pch)

89) /Yd:在所有的obj文件裏寫上完全的調試信息

90) /Yu:在build過程中使用指定的預編譯頭文件

91) /YX:指示編譯器若預編譯頭文件存在,則使用它,若不存在,則創建一個

92) /Z7:生成MSC7.0兼容的調試信息

93) /Za:禁止語言擴展(Microsoft Extensions to C)

94) /Zd:調試信息只包含外部和全局的符號信息以及行號信息

95) /Ze:允許語言擴展(Microsoft Extensions to C)

96) /Zg:爲源文件裏面定義的每個函數生成函數原型

97) /ZI:生成程序庫文件(Pdb)並支持Edit and Continue調試特性

98) /Zi:生成程序庫文件(pdb),包含類型信息和符號調試信息

99) /ZL:從obj文件裏去掉缺省的庫文件名

100)            /Zm:設置編譯器的內存分配xianzhi

101)            /Zn:禁止瀏覽信息文件裏面的封裝

102)            /Zp:設置結構成員在內存裏面的封裝格式

103)            /Zs:快速檢查語法錯誤

--------------------------

vc所支持的文件類型

1)       DSW:全稱是Developer Studio Workspace,最高級別的配置文件,記錄了整個工作空間的配置信息,她是一個純文本的文件,在vc創建新項目的時候自動生成

2)       DSP:全稱是Developer Studio Project,也是一個配置文件,不過她記錄的是一個項目的所有配置信息,純文本文件

3)       OPT:與DSW、DSP配合使用的配置文件,她記錄了與機器硬件有關的信息,同一個項目在不同的機器上的opt文件內容是不同的

4)       CLW:記錄了跟ClassWizard相關的信息,如果丟失了clw文件,那麼在Class View面板裏就沒有類信息

5)       PLG:實際上是一個超文本文件,可以用Internet Explorer打開,記錄了Build的過程,是一個日誌型文件

6)       RC:資源描述文件,記錄了所有的資源信息,在資源編輯器裏作的修改,實際上都是對RC文件的修改

7)       RC2:附加的資源描述文件,不能直接資源編輯器修改,只能手工添加,可以用來添加額外的資源

8)       RES:經過資源編輯器編譯之後的資源文件,以二進制方式存放

9)       SBR:編譯器生成的瀏覽信息文件,在代碼導航的時候非常有用,她需要在編譯時指定/FR或者/Fr開關

10) BSC:BSCMAKE.EXE將所有的SBR文件作爲輸入,經過處理之後輸出一個BSC文件,在代碼導航的時候實際用到的是BSC文件

11) ILK:當選定漸增型編譯連接時,連接器自動生成ILK文件,記錄連接信息

12) PDB:全稱是Program DataBase,即程序數據庫文件,用來記錄調試信息,是一個相當重要的文件,沒有他,程序無法正常調試

13) LIB:如果項目輸出是Dll的話,一般會輸出一個跟項目同名的Lib文件,記錄輸出的函數信息

14) EXP:同Lib,是跟Dll一起生成的輸出文件

15) PCH:全稱是PreCompiled Header,就是預先編譯好的頭文件,在編譯時指定/Yu開關時編譯器自動生成




2008-11-14 17:15

CL.exe   是控制   Microsoft   C   和   C++   編譯器與鏈接器的   32   位工具。編譯器產生通用對象文件格式   (COFF)   對象   (.obj)   文件。鏈接器產生可執行文件   (.exe)   或動態鏈接庫文件   (DLL)。 
   
注意,所有編譯器選項都區分大小寫。 
   
若要編譯但不鏈接,請使用   /c。 
   
使用   NMAKE   生成輸出文件。 
   
使用   BSCMAKE   支持類瀏覽。 
   
以下是一個完整的編譯器選項分類列表。 
   
優化 
   
選項   作用    
/O1   創建小代碼    
/O2   創建快速代碼    
/Oa   假設沒有別名    
/Ob   控制內聯展開    
/Od   禁用優化    
/Og   使用全局優化    
/Oi   生成內部函數    
/Op   改善浮點數一致性    
/Os   代碼大小優先    
/Ot   代碼速度優先    
/Ow   假定在函數調用中使用別名    
/Ox   使用最大優化   (/Ob1gity   /Gs)    
/Oy   省略框架指針    
   
代碼生成 
   
選項   作用    
/clr   啓用   C++   的託管擴展併產生在公共語言運行庫上運行的輸出文件    
/EH   指定異常處理模型    
/G3   優化代碼以優選   386   處理器。在   Visual   C++   5.0   中已經停用,編譯器將忽略此選項    
/G4   優化代碼以優選   486   處理器。在   Visual   C++   5.0   中已經停用,編譯器將忽略此選項    
/G5   優化代碼以優選   Pentium    
/GB   與   /G6   等效;將   _M_IX86   的值設置爲   600    
/Gd   使用   __cdecl   調用約定    
/Ge   激活堆棧探測    
/GF 
/GF   啓用字符串池    
/GH   調用掛鉤函數   _penter    
/GH   調用掛鉤函數   _pexit    
/GL   啓用全程序優化    
/Gm   啓用最小重新生成    
/Gr   啓用運行時類型信息   (RTTI)    
/Gr   使用   __fastcall   調用約定    
/GS   控制堆棧探測    
/GT   支持使用靜態線程本地存儲區分配的數據的纖程安全    
/GX   啓用同步異常處理    
/Gy   啓用函數級鏈接    
/GZ   使用   __stdcall   調用約定    
/MD   使用   MSVCRT.lib   創建多線程   DLL    
/MDd   使用   MSVCRTD.lib   創建調試多線程   DLL    
/ML   使用   LIBC.lib   創建單線程可執行文件    
/MLd   使用   LIBCD.lib   創建調試單線程可執行文件    
/MT   使用   LIBCMT.lib   創建多線程可執行文件    
/MTd   使用   LIBCMTD.lib   創建調試多線程可執行文件    
   
輸出文件 
   
選項   作用    
/FA 
/FA   創建列表文件 
設置列表文件名    
/Fd   重命名程序數據庫文件    
/Fe   重命名可執行文件    
/Fm   創建映射文件    
/Fo   創建對象文件    
/Fp   指定預編譯頭文件名    
/FR 
/FR   生成瀏覽器文件    
/Fx   將插入的代碼與源文件合併    
   
調試 
   
選項   作用    
/GS   緩衝區安全檢查    
/GZ   與   /RTC1   相同    
/RTC   啓用運行時錯誤檢查    
/Wp64   檢測   64   位可移植性問題    
/Yd   將完整的調試信息放在所有對象文件中    
/Yl   創建調試庫時插入   PCH   引用    
/Z7   生成與   C   7.0   兼容的調試信息    
/Zd   生成行號    
/Zi   生成完整的調試信息    
   
預處理器 
   
選項   作用    
/AI   指定在解析傳遞到#using   指令的文件引用時搜索的目錄    
/c   在預處理期間保留註釋    
/D   定義常數和宏    
/E   將預處理器輸出複製到標準輸出    
/EP   將預處理器輸出複製到標準輸出    
/Fl   預處理指定的包含文件    
/FU   強制使用文件名,就像它已被傳遞到#using   指令一樣    
/I   在目錄中搜索包含文件    
/P   將預處理器輸出寫入文件    
/U   移除預定義宏    
/U   移除所有的預定義宏    
/X   忽略標準包含目錄    
/ZI   將調試信息包含在與“編輯並繼續”兼容的程序數據庫中    
   
語言 
   
選項   作用    
/noBool   取消   C++   bool、true   和   false   關鍵字    
/vd   取消或啓用隱藏的   vtordisp   類成員    
/vmb   對指向成員的指針使用最佳的基    
/vmg   對指向成員的指針使用完全一般性    
/vmm   聲明多重繼承    
/vms   聲明單一繼承    
/vmv   聲明虛擬繼承    
/Za   禁用語言擴展    
/Zc   在   /Ze   下指定標準行爲    
/Ze   啓用語言擴展    
/Zg   生成函數原型    
/Zl   從   .obj   文件中移除默認庫名    
/Zp   n   封裝結構成員    
/Zs   只檢查語法    
   
鏈接 
   
選項   作用    
/F   設置堆棧大小    
/LD   創建動態鏈接庫    
/LDd   創建調試動態鏈接庫    
/link   將指定的選項傳遞給   LINK    
/MD   使用   MSVCRT.lib   編譯以創建多線程   DLL    
/MDd   使用   MSVCRTD.lib   編譯以創建調試多線程   DLL    
/ML   使用   LIBC.lib   編譯以創建單線程可執行文件    
/MLd   使用   LIBCD.lib   編譯以創建調試單線程可執行文件    
/MT   使用   LIBCMT.lib   編譯以創建多線程可執行文件    
/MTd   使用   LIBCMTD.lib   編譯以創建調試多線程可執行文件    
   
預編譯頭 
   
選項   作用    
/Y-   忽略當前生成中的所有其他預編譯頭編譯器選項    
/Yc   創建預編譯頭文件    
/Yd   將完整的調試信息放在所有對象文件中    
/Yu   在生成期間使用預編譯頭文件    
/YX   自動處理預編譯頭    
   
雜項 
   
選項   作用    
@   指定響應文件    
/?   列出編譯器選項    
/c   編譯但不鏈接    
/H   限制外部(公共)名稱的長度    
/HELP   列出編譯器選項    
/J   更改默認的   char   類型    
/NOLOGO   取消顯示登錄版權標誌    
/QI0f   確保   Pentium   0F   指令沒有問題    
/QIfdiv   FDIV、FPREM、FPTAN   和   FPATAN   指令有缺陷的   Intel   Pentium   微處理器的變通方法    
QIfist   當需要從浮點類型轉換爲整型時取消   Helper   函數   _ftol   的調用    
/showIncludes   在編譯期間顯示所有包含文件的列表    
/Tc 
/Tc   指定   C   源文件    
/Tp 
/Tp   指定   C++   源文件    
/V   設置版本字符串    
/w   設置警告等級    
/w   禁用所有警告    
/Wall   啓用所有警告,包括默認情況下禁用的警告    
/WL   在從命令行編譯   C++   源代碼時啓用錯誤信息和警告消息的單行診斷    
/Zm   設置編譯器的內存分配限制    
CL   命令行使用下列語法: 
   
CL   [option...]   file...   [option   |   file]...   [lib...]   [@command-file]   [/link   link-opt...] 
   
下表說明CL   命令的輸入項意義    
   
option   一個或多個   CL   選項。請注意,所有選項都應用於所有指定的源文件。選項是由一個正斜槓   (/)   或一個短劃線   (–)   指定的。如果某個選項帶有參數,則該選項的說明指定在選項和參數之間是否允許有空格。選項名(/HELP   選項除外)區分大小寫。有關更多信息,請參閱   CL   選項的順序。      
   
file   一個或多個源文件、.obj   文件或庫的名稱。CL   編譯源文件並將   .obj   文件和庫的名稱傳遞給鏈接器。有關更多信息,請參閱   CL   文件名語法。      
   
lib   一個或多個庫名。CL   將這些名稱傳遞給鏈接器。    
   
command-file   包含多個選項和文件名的文件。有關更多信息,請參閱   CL   命令文件。    
   
link-opt   一個或多個鏈接器選項。CL   將這些選項傳遞給鏈接器。    
   
您可以指定任意數目的選項、文件名和庫名,條件是命令行上的字符數不超過   1024,該限制是操作系統指定的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章