VC6.0編譯器參數的設置

VC6.0編譯器參數的設置

-轉載-

主要通過VC的菜單項Project->Settings->C/C++頁來完成。我們可以看到這一頁的最下面Project Options中的內容,一般如下:

/nologo /MDd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_AFXDLL" /D "_MBCS" /Fp"Debug/WritingDlgTest.pch" /Yu"stdafx.h" /Fo"Debug/" /Fd"Debug/" /FD /GZ /c

各個參數代表的意義,可以參考Msdn。比如/nologo表示編譯時不在輸出窗口顯示這些設置(我們可以把這個參數去掉來看看效果)等等。一般我們不會直接修改這些設置,而是通過這一頁最上面的Category中的各項來完成。

1) General:一些總體設置。

  • Warning level 用來控制警告信息,其中Level 1是最嚴重的級別;
  • Warnings as errors 將警告信息當作錯誤處理;
  • Optimizations 代碼優化,可以在Category的Optimizations項中進行更細的設置;
  • Generate browse info 用以生成.sbr文件,記錄類、變量等符號信息,可以在Category的Listing Files項中進行更多的設置。
  • Debug info 生成調試信息:
    • None,不產生任何調試信息(編譯比較快);
    • Line Numbers Only,僅生成全局的和外部符號的調試信息到.OBJ文件或.EXE文件,減小目標文件的尺寸;
    • C 7.0- Compatible,記錄調試器用到的所有符號信息到.OBJ文件和.EXE文件;
    • Program Database,創建.PDB文件記錄所有調試信息;
    • Program Database for "Edit & Continue",創建.PDB文件記錄所有調試信息,並且支持調試時編輯。

2) C++ Language

  • Pointer-to-member representation 用來設置類定義/引用的先後關係:
    • Best-Case Always,表示在引用類之前該類肯定已經定義;
    • General-Purpose Always,?
      • Point to Any Class
      • Point to Single- and Multiple-Inheritance Classes
      • Point to Single-Inheritance Classes
  • Enable Exception Handling,進行同步的異常處理;
  • Enable Run-Time Type Information 迫使編譯器增加代碼在運行時進行對象類型檢查;
  • Disable Construction Displacements 設置類構造/析構函數調用虛函數問題。

3) Code Generation

  • Processor 表示代碼指令優化,可以爲80386、80486、Pentium、Pentium Pro,或者Blend表示混合以上各種優化。
  • Use run-time library 用以指定程序運行時使用的運行時庫,有一個原則就是,一個進程不要同時使用幾個版本的運行時庫。連接了單線程庫就不支持多線程調用,連接了多線程庫就要求創建多線程的應用程序。
    • Single-Threaded,單線程Release版本,靜態連接LIBC.LIB庫;
    • Debug Single-Threaded,單線程Debug版本,靜態連接LIBCD.LIB庫;
    • Multithreaded,多線程Release版本,靜態連接LIBCMT.LIB庫;
    • Debug Multithreaded,多線程Debug版本,靜態連接LIBCMTD.LIB庫;
    • Multithreaded DLL,動態連接MSVCRT.DLL庫;
    • Debug Multithreaded DLL,動態連接MSVCRTD.DLL庫。
  • Calling convention 可以用來設定調用約定,有三種:__cdecl、__fastcall和__stdcall。

      各種調用約定的主要區別在於:1. 函數調用時,函數的參數是從左到右壓入堆棧還是從右到左壓入堆棧;2. 在函數返回時,由函數的調用者來清理壓入堆棧的參數還是由函數本身來清理;3. 以及在編譯時對函數名進行的命名修飾(可以通過Listing Files看到各種命名修飾方式)。

  • Struct member alignment 用以指定數據結構中的成員變量在內存中是按幾字節對齊的,根據計算機數據總線的位數,不同的對齊方式存取數據的速度不一樣。這個參數對數據包網絡傳輸等應用尤爲重要,不是存取速度問題,而是數據位的精確定義問題,一般在程序中使用#pragma pack來指定。

4) Customize

  • Disable Language Extensions,表示不使用微軟爲標準C做的語言擴展;
  • Eliminate Duplicate Strings,主要用於字符串優化(將字符串放到緩充池裏以節省空間),使用這個參數,使得

                char *sBuffer = "This is a character buffer";

                 char *tBuffer = "This is a character buffer";

                 sBuffer 和tBuffer指向的是同一塊內存空間;

  • Enable Function-Level Linking ,告訴編譯器將各個函數按打包格式編譯;
  • Enables minimal rebuild,通過保存關聯信息到.IDB文件,使編譯器只對最新類定義改動過的源文件進行重編譯,提高編譯速度;
  • Enable Incremental Compilation,同樣通過.IDB文件保存的信息,只重編譯最新改動過的函數;
  • Suppress Startup Banner and Information Messages,用以控制參數是否在output窗口輸出。

5) Listing Files

  • Generate browse info 上面已經提到過。這裏可以進行更多的設置。
  • Exclude Local Variables from Browse Info 表示是否將局部變量的信息放到.SBR文件中。
  • Listing file type 可以設置生成的列表信息文件的內容:
    • Assembly-Only Listing 僅生成彙編代碼文件(.ASM擴展名);
    • Assembly With Machine Code 生成機器代碼和彙編代碼文件(.COD擴展名);
    • Assembly With Source Code 生成源代碼和彙編代碼文件(.ASM擴展名);
    • Assembly, Machine Code, and Source 生成機器碼、源代碼和彙編代碼文件(.COD擴展名)。
  • Listing file name 生成的信息文件的路徑,一般爲Debug或Release目錄下,生成的文件名自動取源文件的文件名。

6) Optimizations 代碼優化設置。

  • Maximize Speed 生成最快速的代碼;
  • Minimize Size 生成最小尺寸的程序;
  • Customize 定製優化。定製的內容包括:
    • Assume No Aliasing,不使用別名(提高速度);
    • Assume Aliasing Across Function Calls,僅函數內部不使用別名;
    • Global Optimizations,全局優化,比如經常用到的變量使用寄存器保存,或者循環內的計算優化,如i = -100;while( i < 0 ){ i += x + y;}會被優化爲i = -100;t = x + y;while( i < 0 ){i += t;};
    • Generate Intrinsic Functions,使用內部函數替換一些函數調用(提高速度);
    • Improve Float Consistency,浮點運算方面的優化;
    • Favor Small Code,程序(exe或dll)尺寸優化優先於代碼速度優化;
    • Favor Fast Code,程序(exe或dll)代碼速度優化優先於尺寸優化;
    • Frame-Pointer Omission,不使用幀指針,以提高函數調用速度;
    • Full Optimization,組合了幾種參數,以生成最快的程序代碼。
  • Inline function expansion,內聯函數擴展的三種優化(使用內聯可以節省函數調用的開銷,加快程序速度):
    • Disable,不使用內聯;
    • Only __inline,僅函數定義前有inline或__inline標記使用內聯;
    • Any Suitable,除了inline或__inline標記的函數外,編譯器"覺得"應該使用內聯的函數,都使用內聯。

7) Precompiled Headers 預編譯頭文件的設置。使用預編譯可以提高重複編譯的速度。VC一般將一些公共的、不大變動的頭文件(比如afxwin.h等)集中放到stdafx.h中,這一部分代碼就不必每次都重新編譯(除非是Rebuild All)。

8) Preprocessor 預編譯處理。可以定義/解除定義一些常量。

  • Additional include directories,可以指定額外的包含目錄,一般是相對於本項目的目錄,如..\Include。

    連接參數的設置

    主要通過VC的菜單項Project->Settings->Link頁來完成。我們可以看到這一頁的最下面Project Options中的內容,一般如下:

    /nologo /subsystem:windows /incremental:yes /pdb:"Debug/WritingDlgTest.pdb" /debug /machine:I386 /out:"Debug/WritingDlgTest.exe" /pdbtype:sept

    下面我們分別來看一下Category中的各項設置。

    1) General 一些總體設置。可以設置生成的文件路徑、文件名;連接的庫文件;

    • Generate debug info,生成Debug信息到.PDB文件(具體格式可以在Category->Debug中設置);
    • Ignore All Default Libraries,放棄所有默認的庫連接;
    • Link Incrementally,通過生成. ILK文件實現遞增式連接以提高後續連接速度,但一般這種方式下生成的文件(EXE或DLL)較大;
    • Generate Mapfile,生成.MAP文件記錄模塊相關信息;
    • Enable Profiling,這個參數通常與Generate Mapfile參數同時使用,而且如果產生Debug信息的話,不能用.PDB文件,而且必須用Microsoft Format。

    2) Customize 這裏可以進行使用程序數據庫文件的設置。

    • Force File Output,強制產生輸出文件(EXE或DLL);
    • Print Progress Messages,可以將連接過程中的進度信息輸出到Output窗口。

    3) Debug 設置是否生成調試信息,以及調試信息的格式。

    • Dubug info,格式可以有Microsoft Format、COFF Format(Common Object File Format)和Both Formats三種選擇;
    • Separate Types,表示將Debug格式信息以獨立的.PDB文件存放,還是直接放在各個源文件的.PDB文件中。選中的話,表示採用後者的方式,這種方式調試啓動比較快。

    4) Input 這裏可以指定要連接的庫文件,放棄連接的庫文件。還可以增加額外的庫文件目錄,一般是相對於本項目的目錄,如..\Lib。

    • Force Symbol References,可以指定連接特定符號定義的庫。

    5) Output 

    • Base Address 可以改變程序默認的基地址(EXE文件默認爲0x400000,DLL默認爲0x10000000),操作系統裝載一個程序時總是試着先從這個基地址開始。
    • Entry-Point Symbol 可以指定程序的入口地址,一般爲一個函數名(且必須採用__stdcall調用約定)。一般Win32的程序,EXE的入口爲 WinMain,DLL的入口爲DllEntryPoint;最好讓連接器自動設置程序的入口點。默認情況下,通過一個C的運行時庫函數來實現:控制檯程序採用mainCRTStartup (或wmainCRTStartup)去調用程序的main (或wmain)函數;Windows程序採用WinMainCRTStartup (或 wWinMainCRTStartup)調用程序的WinMain (或 wWinMain,必須採用__stdcall調用約定);DLL採用_DllMainCRTStartup調用DllMain函數(必須採用 __stdcall調用約定)。
    • Stack allocations 用以設置程序使用的堆棧大小(請使用十進制),默認爲1兆字節。
    • Version Information 告訴連接器在EXE或DLL文件的開始部分放上版本號。

    值得注意的是:

    1. 上面各個參數是大小寫敏感的;
    2. 在參數後加上"-"表示該參數無效;
    3. 各個參數值選項有"*"的表示爲該參數的默認值;
    4. 可以使用頁右上角的"Reset"按鈕來恢復該頁的所有默認設置。

    其它一些參數設置。

    1) Project->Settings->General,可以設置連接MFC庫的方式(靜態或動態)。如果是動態連接,在MFC軟件發佈時不要忘了帶上MFC的DLL。

    2) Project->Settings->Debug,可以設置調試時運行的可執行文件,以及命令行參數等。

    3) Project->Settings->Custom Build,可以設置編譯/連接成功後自動執行一些操作。比較有用的是,寫COM時希望VC對編譯通過的COM文件自動註冊,可以如下設置:

    Description: Register COM

    Commands: regsvr32 /s /c $(TargetPath)

    echo regsvr32 exe.time > $(TargetDir)\$(TargetName).trg

    Outputs: $(TargetDir)\$(TargetName).trg

    4) Tools->Options->Directories,設置系統的Include、Library路徑。


  • CL.exe的全部命令開關

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

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

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

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

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

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

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

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

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

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

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

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

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

    /Fm:創建map文件

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

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

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

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

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

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

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

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

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

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

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

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

    /Ge:激活堆棧檢測

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

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

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

    /Gi:允許漸進編譯

    /Gm:允許最小化rebuild

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /Od:禁止代碼優化

    /Og:使用全局優化

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /W:設置警告等級

    /w:禁止所有警告

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /Zs:快速檢查語法錯誤   

    一些小竅門

    1) 有時候,你可能在編譯的時候,計算機突然非法關機了(可能某人不小心碰了電源或你的內存不穩定等原因)。當你重啓機器後打開剛纔的項目,重新進行編譯,發現VC會崩掉。你或許以爲你的VC編譯器壞了,其實不然(你試試編譯其它項目,還是好的!),你只要將項目的.ncb、.opt、.aps、.clw文件以及Debug、Release目錄下的所有文件都刪掉,然後重新編譯就行了。

    2) 如果你想與別人共享你的源代碼項目,但是把整個項目做拷貝又太大。你完全可以刪掉以下文件:.dsw、.ncb、.opt、.aps、.clw、. plg文件以及Debug、Release目錄下的所有文件。

    3) 當你的Workspace中包含多個Project的時候,你可能不能直觀地、一眼看出來哪個是當前項目。可以如下設置:Tools-> Options->Format,然後在Category中選擇Workspace window,改變其默認的字體(比如設成Fixedsys)就行了。

    4) 如何給已有的Project改名字?將該Project關掉。然後以文本格式打開.dsp文件,替換原來的Project名字即可。

    5) VC6對類成員的智能提示功能很有用,但有時候會失靈。你可以先關掉項目,將.clw和.ncb刪掉,然後重新打開項目,點擊菜單項View-> ClassWizard,在彈出的對話框中按一下"Add All"按鈕;重新Rebuild All。應該可以解決問題

發佈了15 篇原創文章 · 獲贊 20 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章