程序底层工具:cl编译器
說慣了面向硬件的操作系統,也應該說說操作系統的主要使用對象–用戶程序。要深入理解程序的運作過程,則需要了解編譯原理、鏈接、裝載和運行庫等知識。一般都是IDE封裝了這些過程,一個簡單的Shift+F5指令封裝了“預編譯+編譯+匯編+鏈接+裝載”全過程,而要想分割獨立地控制或挖掘這些子過程,則不得不借助一些工具,如預編譯編譯程序cl、匯編器as、鏈接器link、查看工具dumpbin(針對Windows PE文件結構)、binutils工具套件(配合gcc針對ELF文件結構)等。
利用編譯器可以深度控制你自己的代碼,并且可以比IDE編譯更快,當然付出的代價便是你某種程度上需要事必躬親,而不像使用IDE那么一鍵速成。
首先如果你想要在你的windows電腦上使用cl編譯器,你首先得把cl編譯器的環境變量給設置一下,否則你的命令行將會顯示沒有這樣的啟動項或命令。
PATH = **YourVS-install-place**\VC\bin INCLUDE = **YourVS-install-place**\VC\include LIB = **YourVS-install-place**\VC\lib如果提示找不到mspdb80.dll,則需要手動從VC\Common7\IDE下拷貝“msobj80.dll\mspdb80.dll\mspdbcore.dll\mspdbsrv.exe”到VC\bin下即可。
/*CL命令格式*/ CL [option...] file... [option | file] ...[lib] [@command-file] [/link link-opt] cl [選項...] 文件名...[/link鏈接選項...] /* 1. option: 參數選項可以使用“/”或“-”修飾給出具體含義可使用>cl /help option展示*********. c/c++ 編譯器選項 ---優化----*************/O1 最小化空間,使得產生的可執行代碼最小 /O2 最大化速度,使得優化后的可執行代碼運行最快/Od 禁用優化選項(編譯起default)/Og 啟用全局優化 /Oi[-] 啟用內部函數,用內部函數去代替程序里的函數調用,可以使程序加速,但是程序長度增加/Os 偏向于代碼空間優化 /Ot 偏向于代碼速度優化/Ox 組合了幾個優化開關,最大化優化 /Oy 阻止調用堆棧里,創建幀指針(僅x86)/favor 對于特定架構平臺的優化/favor:[blend/ATOM/AMD64/INTEL64]***********************************************************. c/c++ 編譯器選項 ---代碼生成----*************1. /arch:<SSE | SSE2 | AUX> CPU架構的最低要求,以下為選項信息 SSE - 啟用支持SSE的CPU可用的指令 SSE2(https://baike.baidu.com/item/SSE2/1190211?fr=aladdin) - 啟用支持SSE2的CPU可用的指令 AUX - 支持使用Intel(R)高級矢量擴展指令2. /GA 對windows應用程序進行優化3. /Gd 采用__cdecl調用慣例4. /GD 為Windows動態庫DLL做優化,此功能在VC6之前并沒有5. /Ge 對所有函數強制堆棧檢查6. /GF 消除程序中的重復的字符串,并啟用只讀字符串池,將該字符串放入只讀的緩沖區中7. /Gf 消除程序中的重復字符串8. /Gh 在每個函數的開頭調用鉤子函數_penter9. /GH 在每個函數的末尾啟用鉤子函數_pexit10. /GL 啟用鏈接時代碼生成,打開整個程序優化 11. /Gm[-] 啟用最小重新生成rebuild12. /GR 打開C++ 運行時類型信息RTTI(RunTime Type Information)13. /Gr 采用__fastcall 調用規定14. /GS 檢查緩沖區安全檢查15. /Gs[num] 控制堆棧檢測所用的內存大小16. /GT 使用TLS(thread Local storage)靜態線程本地存儲時保證數據分配安全, //支持用_declspec(thread)分配的數據的fier-safety17. /Gv 使用__vectorcall調用慣例18. /Gw 打開整個程序的全局數據優化19. /GX 打開同步異常處理,與/EHsc開關等價20. /Gy[-] 分隔鏈接器函數,打開函數級鏈接21. /GZ 啟用堆棧檢查(/RTCs)22. /Gz 使用__stdcall調用慣例23. /clr[:option] 產生運行在the common language runtime上的輸出文件,其中option是: pure--生成只包含IL的輸出文件 safe--生成只包含IL的可驗證輸出文件 oldSyntax--接受VC++ 2002/2003的托管擴展語法 initialAppDomain--啟用VC++ 2002的初始AppDomain行為 noAssembly--不產生程序集24./hotpatch 確保可熱修補映射的函數填充,創建一個補丁鏡像25./QIfist 禁止浮點數轉換為整數時調用_fotl(),而使用FIST26./Qimprecise_fwaits 在try塊內部移除FWAITs指令,而僅在try邊界生成27./Qsafe_fp_loads 生成安全FP負載28./EHs 啟用C++ EH(沒有SEH異常)29./EHa 啟用C++ EH(w/ SEH異常)30./EHc 外部“C”默認為nothrow31./RTC1 啟用快速檢查32./RTCc 轉換為較小的類型檢查33./RTCs 堆棧幀運行時檢查34./RTCu 未初始化的局部用法檢查/*感覺除了幾個調用慣例設置和鉤子函數的設置外,其他選項基本上用不到*/************************************************************************. c/c++ 編譯器選項 ---輸出文件----*************1./doc[file] 處理注釋文檔到一個XML文件2./Fa[file] 創建匯編列表文件,指定用/FA設置的列表文件的存放路徑及(或)文件名3./FA 配置匯編列表文件,設置生成何種列表文件(匯編、匯編與機器碼、匯編與源碼、匯編與機器碼以及源碼)4./Fd[file] 命名.PDB文件5./Fe<file> 命名可執行文件6./Fm[file] 創建mapfile映射文件7./Fo<file> 命名對象.obj文件8./Fp<file> 指定預編譯頭文件9./Fr[file] 命名源瀏覽器文件10./Fi[file] 指定預處理輸出的文件名************************************************************************. c/c++ 編譯器選項 ---預處理器----*************1./AI<dir> Specifies a directory to search to resolve file references passed to the #using directive.添加到程序集搜索路徑 2./C Preserves comments during preprocessing.不抽出注釋 3./D<name>{=|#}<text> 定義宏,與源程序中#define效果相同 4./E 復制預處理到標準輸出 5./EP 復制預處理到標準輸出,無行號 6./P 寫預處理到一個輸出文件,文件的后綴名為I 7./FI<file> 預處理指定的include文件 8./Fx 合并注入代碼和源代碼,將插入的代碼合并到文件中 9./I<dir> 指定include文件搜索路徑 10./U 刪除預定義宏 11./u 和/U相同 12./X 忽略標準include路徑,阻止編譯器搜索標準的include目錄 13./Yc[file] 創建預編譯頭文件(.pch) 14./Yd 在所有的obj文件里寫上完全的調試信息,將調試信息放在每個.obj文件中 15./Yu[file] 在build過程中使用指定的預編譯頭文件 16./YX 指示編譯器若預編譯頭文件存在,則使用它,若不存在,則創建一個************************************************************************. c/c++ 編譯器選項 --語言相關----************* /openmp 啟用OpenMP 2.0語言擴展,打開#pragma omp在源代碼中 /vd 禁止或者打開隱藏vtordisp類的成員(構造函數置換) /vmb 選擇指針的表示方法,使用這個開關,在聲明指向某個類的成員的指針之前,必須先定義這個類,Uses best base for pointers to members. /vmg 選擇指針的表示方法,使用這個開關,在聲明指向某個類的成員的指針之前,不必先定義這個類,但是要指定這個類是使用何種繼承方法,Uses full generality for pointers to members. /vmm 設置指針的表示方法為多繼承 /vms 設置指針的表示方法為單繼承 /vmv 設置指針的表示方法為虛擬繼承Any class /Z7 產生和C 7.0兼容的調試信息 /Za 禁用語音擴展(微軟編譯器對C的擴展Micrsoft Extension to C) /Zc 指定一個標準行為在/Ze下 /Zd 調試信息只包含外部和全局的符號信息以及行號信息 /Ze 允許語言擴展(Micrsoft Extension to C) /Zg 產生函數原型,為源文件里面定義的每個函數生成函數原型 /ZI 生成程序庫文件(.Pdb),并支持Edit and Continue調試特性,在程序數據庫中包括調試信息(僅x86) /Zi 生成程序庫文件(.Pdb),產生完整的調試信息,啟用調試信息 /Zl 從.obj文件中刪除默認的庫名 /Zp[n] 在n字節邊界上包裝結構,設置結構成員在內存里面的封裝格式 /Zs 快速檢查語法錯誤 /ZW 產生一個輸出文件能運行在windows運行環境************************************************************************. c/c++ 編譯器選項 ---鏈接----************* /F<num> 設置堆棧尺寸 /LD 創建動態鏈接庫 /LDd 創建一個調試動態鏈接庫含有debug信息 /link 將指定的參數選項傳遞各鏈接器 /LN 創建.netmodule,創建一個MSIL模型 /MD 編譯創建一個多線程 DLL,使用msvcrt.lib /MDd 編譯創建一個調試多線程 DLL,Debug版本,使用msvcrtd.lib /MT 編譯創建一個多線程執行程序,使用libcmt.lib /MTd 編譯場景一個調試多線程執行程序,Debug版本,使用libcmtd.lib************************************************************************. c/c++ 編譯器選項 ---雜項----************* /? 列出編譯選項 @<file> 指定一個響應文件 /analyze 打開代碼分析 /bigobj 生成擴展的對象格式 /c 編譯但不鏈接,即只生成.obj文件 /errorReport<option> 打開在vc++終端中提供內部編譯錯誤信息(ICE) /FC 顯示傳遞給cl.exe的源代碼的完整路徑到一個文件中 /FS 強制寫入一個程序數據庫文件(PDB) /H<n> 限制外部名字的長度,最大外部名稱長度 /HELP 列出編譯選項 /J 改變默認char類型,從signed char改成unsigned char /kernel 編譯器和鏈接器將創建一個可以在windows內核中執行的執行程序 /MP[n] 同時建造多源代碼文件,最多使用n個進行編譯 /nologo 禁止顯示啟動版權標志,取消顯示版權信息 /sdl 打開一些附加的安全功能和警告 /showIncludes 在編譯期間顯示全部include文件的列表/TC 將所有文件看做C源程序編譯,不管后綴名是否為.c /Tc 將指定的文件當作C源程序編譯,不管后綴名是否為.c /TP 將所有文件看做C++源程序編譯,不管后綴名是否為.cpp /Tp 將指定文件當作C++源程序編譯,不管后綴名是否為.cpp/V 版本信息 /Y 禁用所有PCH選項/Wall 打開全部警告,包括默認關閉的警告 /w 關閉全部警告 /wd<n> 禁用警告n /we<n> 將警告n視為錯誤 /wo<n> 將警告n發出一次 /w<l><n> 將警告n設置警告等級1-4 /W<n> 設置警告等級(默認n=1) /WL 打開在用命令行編譯C++源代碼時使用一行顯示錯誤和警告信息,啟用單行診斷 /WX 將警告視為錯誤 /Wp64 偵測可能的64-bit問題,啟用64位端口定位警告/Yd 在對象文件中放置完整的調試信息 /Yl 當創建一個調試庫時植入PCH引用 /Zm<n> 最大內存分配,默認為百分數%*************************************************************** */vc所支持的文件類型
1) DSW:全稱是Developer Studio Workspace,最高級別的配置文件,記錄了整個工作空間的配置信息,是一個純文本的文件,在vc創建新項目的時候自動生成
2) DSP:全稱是Developer Studio Project,也是一個配置文件,不過記錄的是一個項目的所有配置信息,純文本文件,相當于manifest文件
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文件,記錄輸出的函數信息,俗稱膠水代碼,一般在link時,可以使用同名.lib,用來指向具體實現的.dll文件
14) EXP:同Lib,是跟Dll一起生成的輸出文件
15) PCH:全稱是PreCompiled Header,就是預先編譯好的頭文件,在編譯時指定/Yu開關時編譯器自動生成
總結
以上是生活随笔為你收集整理的程序底层工具:cl编译器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 推理机Jess,Racer,Jena
- 下一篇: iminicam服务器维护,iminic