今天查資料的時候發現 VS 編譯器 CL 的一個編譯選項可以查看 C++ 類的內存佈局,非常有用。使用如下,從開始程序菜單找到 Visual Stdio 2008/2005 Command Prompt,選擇 VS 的命令行工具,按如下格式使用:
>cl –d1reportSingleClassLayout[classname] test.cpp
而使用 –d1reportAllClassLayout 則可以查看源文件中所有類及結構體的內存佈局。
其中,classname 爲類名,-d1reportSingleClassLayout[classname] 之間沒有空格。編寫程序測試:
比較奇怪,加上 #include <iostream> 後,測試結構體的時候就會出現很輸出,應該是庫中的類,看起來真麻煩,所以這裏去掉它。
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,該限制是操作系統指定的。