VC6.0編譯器參數(shù)的設(shè)置主要通過VC的菜單項Project->Settings->C/C++頁來完成。我們可以看到這一頁的最下面Project Options中的內(nèi)容,一般如下:
/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
各個參數(shù)代表的意義,可以參考Msdn。比如/nologo表示編譯時不在輸出窗口顯示這些設(shè)置(我們可以把這個參數(shù)去掉來看看效果)等等。一般我們不會直接修改這些設(shè)置,而是通過這一頁最上面的Category中的各項來完成......
-轉(zhuǎn)載-
主要通過VC的菜單項Project->Settings->C/C++頁來完成。我們可以看到這一頁的最下面Project Options中的內(nèi)容,一般如下:
/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
各個參數(shù)代表的意義,可以參考Msdn。比如/nologo表示編譯時不在輸出窗口顯示這些設(shè)置(我們可以把這個參數(shù)去掉來看看效果)等等。一般我們不會直接修改這些設(shè)置,而是通過這一頁最上面的Category中的各項來完成。
1) General:一些總體設(shè)置。
Warning level 用來控制警告信息,其中Level 1是最嚴(yán)重的級別; Warnings as errors 將警告信息當(dāng)作錯誤處理; Optimizations 代碼優(yōu)化,可以在Category的Optimizations項中進(jìn)行更細(xì)的設(shè)置; Generate browse info 用以生成.sbr文件,記錄類、變量等符號信息,可以在Category的Listing Files項中進(jìn)行更多的設(shè)置。
Debug info 生成調(diào)試信息:None,不產(chǎn)生任何調(diào)試信息(編譯比較快); Line Numbers Only,僅生成全局的和外部符號的調(diào)試信息到.OBJ文件或.EXE文件,減小目標(biāo)文件的尺寸; C 7.0- Compatible,記錄調(diào)試器用到的所有符號信息到.OBJ文件和.EXE文件; Program Database,創(chuàng)建.PDB文件記錄所有調(diào)試信息; Program Database for "Edit & Continue",創(chuàng)建.PDB文件記錄所有調(diào)試信息,并且支持調(diào)試時編輯。
2) C++ Language
Pointer-to-member representation 用來設(shè)置類定義/引用的先后關(guān)系:Best-Case Always,表示在引用類之前該類肯定已經(jīng)定義; General-Purpose Always,?
Point to Any Class Point to Single- and Multiple-Inheritance Classes Point to Single-Inheritance Classes Enable Exception Handling,進(jìn)行同步的異常處理; Enable Run-Time Type Information 迫使編譯器增加代碼在運(yùn)行時進(jìn)行對象類型檢查; Disable Construction Displacements 設(shè)置類構(gòu)造/析構(gòu)函數(shù)調(diào)用虛函數(shù)問題。
3) Code Generation
Processor 表示代碼指令優(yōu)化,可以為80386、80486、Pentium、Pentium Pro,或者Blend表示混合以上各種優(yōu)化。
Use run-time library 用以指定程序運(yùn)行時使用的運(yùn)行時庫,有一個原則就是,一個進(jìn)程不要同時使用幾個版本的運(yùn)行時庫。連接了單線程庫就不支持多線程調(diào)用,連接了多線程庫就要求創(chuàng)建多線程的應(yīng)用程序。Single-Threaded,單線程Release版本,靜態(tài)連接LIBC.LIB庫; Debug Single-Threaded,單線程Debug版本,靜態(tài)連接LIBCD.LIB庫; Multithreaded,多線程Release版本,靜態(tài)連接LIBCMT.LIB庫; Debug Multithreaded,多線程Debug版本,靜態(tài)連接LIBCMTD.LIB庫; Multithreaded DLL,動態(tài)連接MSVCRT.DLL庫; Debug Multithreaded DLL,動態(tài)連接MSVCRTD.DLL庫。 Calling convention 可以用來設(shè)定調(diào)用約定,有三種:__cdecl、__fastcall和__stdcall。
各種調(diào)用約定的主要區(qū)別在于:1. 函數(shù)調(diào)用時,函數(shù)的參數(shù)是從左到右壓入堆棧還是從右到左壓入堆棧;2. 在函數(shù)返回時,由函數(shù)的調(diào)用者來清理壓入堆棧的參數(shù)還是由函數(shù)本身來清理;3. 以及在編譯時對函數(shù)名進(jìn)行的命名修飾(可以通過Listing Files看到各種命名修飾方式)。
Struct member alignment 用以指定數(shù)據(jù)結(jié)構(gòu)中的成員變量在內(nèi)存中是按幾字節(jié)對齊的,根據(jù)計算機(jī)數(shù)據(jù)總線的位數(shù),不同的對齊方式存取數(shù)據(jù)的速度不一樣。這個參數(shù)對數(shù)據(jù)包網(wǎng)絡(luò)傳輸?shù)葢?yīng)用尤為重要,不是存取速度問題,而是數(shù)據(jù)位的精確定義問題,一般在程序中使用#pragma pack來指定。
4) Customize
Disable Language Extensions,表示不使用微軟為標(biāo)準(zhǔn)C做的語言擴(kuò)展; Eliminate Duplicate Strings,主要用于字符串優(yōu)化(將字符串放到緩充池里以節(jié)省空間),使用這個參數(shù),使得
????????????char *sBuffer = "This is a character buffer";
???????????? char *tBuffer = "This is a character buffer";
???????????? sBuffer 和tBuffer指向的是同一塊內(nèi)存空間; Enable Function-Level Linking ,告訴編譯器將各個函數(shù)按打包格式編譯; Enables minimal rebuild,通過保存關(guān)聯(lián)信息到.IDB文件,使編譯器只對最新類定義改動過的源文件進(jìn)行重編譯,提高編譯速度;
Enable Incremental Compilation,同樣通過.IDB文件保存的信息,只重編譯最新改動過的函數(shù);
Suppress Startup Banner and Information Messages,用以控制參數(shù)是否在output窗口輸出。
5) Listing Files
Generate browse info 上面已經(jīng)提到過。這里可以進(jìn)行更多的設(shè)置。 Exclude Local Variables from Browse Info 表示是否將局部變量的信息放到.SBR文件中。
Listing file type 可以設(shè)置生成的列表信息文件的內(nèi)容:Assembly-Only Listing 僅生成匯編代碼文件(.ASM擴(kuò)展名); Assembly With Machine Code 生成機(jī)器代碼和匯編代碼文件(.COD擴(kuò)展名); Assembly With Source Code 生成源代碼和匯編代碼文件(.ASM擴(kuò)展名); Assembly, Machine Code, and Source 生成機(jī)器碼、源代碼和匯編代碼文件(.COD擴(kuò)展名)。 Listing file name 生成的信息文件的路徑,一般為Debug或Release目錄下,生成的文件名自動取源文件的文件名。
6) Optimizations 代碼優(yōu)化設(shè)置。
Maximize Speed 生成最快速的代碼; Minimize Size 生成最小尺寸的程序; Customize 定制優(yōu)化。定制的內(nèi)容包括:Assume No Aliasing,不使用別名(提高速度); Assume Aliasing Across Function Calls,僅函數(shù)內(nèi)部不使用別名; Global Optimizations,全局優(yōu)化,比如經(jīng)常用到的變量使用寄存器保存,或者循環(huán)內(nèi)的計算優(yōu)化,如i = -100;while( i < 0 ){ i += x + y;}會被優(yōu)化為i = -100;t = x + y;while( i < 0 ){i += t;};Generate Intrinsic Functions,使用內(nèi)部函數(shù)替換一些函數(shù)調(diào)用(提高速度); Improve Float Consistency,浮點運(yùn)算方面的優(yōu)化; Favor Small Code,程序(exe或dll)尺寸優(yōu)化優(yōu)先于代碼速度優(yōu)化; Favor Fast Code,程序(exe或dll)代碼速度優(yōu)化優(yōu)先于尺寸優(yōu)化; Frame-Pointer Omission,不使用幀指針,以提高函數(shù)調(diào)用速度; Full Optimization,組合了幾種參數(shù),以生成最快的程序代碼。 Inline function expansion,內(nèi)聯(lián)函數(shù)擴(kuò)展的三種優(yōu)化(使用內(nèi)聯(lián)可以節(jié)省函數(shù)調(diào)用的開銷,加快程序速度):Disable,不使用內(nèi)聯(lián); Only __inline,僅函數(shù)定義前有inline或__inline標(biāo)記使用內(nèi)聯(lián); Any Suitable,除了inline或__inline標(biāo)記的函數(shù)外,編譯器"覺得"應(yīng)該使用內(nèi)聯(lián)的函數(shù),都使用內(nèi)聯(lián)。
7) Precompiled Headers 預(yù)編譯頭文件的設(shè)置。使用預(yù)編譯可以提高重復(fù)編譯的速度。VC一般將一些公共的、不大變動的頭文件(比如afxwin.h等)集中放到stdafx.h中,這一部分代碼就不必每次都重新編譯(除非是Rebuild All)。
8) Preprocessor 預(yù)編譯處理??梢远x/解除定義一些常量。
Additional include directories,可以指定額外的包含目錄,一般是相對于本項目的目錄,如..Include。
連接參數(shù)的設(shè)置
主要通過VC的菜單項Project->Settings->Link頁來完成。我們可以看到這一頁的最下面Project Options中的內(nèi)容,一般如下:
/nologo /subsystem:windows /incremental:yes /pdb:"Debug/WritingDlgTest.pdb" /debug /machine:I386 /out:"Debug/WritingDlgTest.exe" /pdbtype:sept
下面我們分別來看一下Category中的各項設(shè)置。
1) General 一些總體設(shè)置??梢栽O(shè)置生成的文件路徑、文件名;連接的庫文件;
Generate debug info,生成Debug信息到.PDB文件(具體格式可以在Category->Debug中設(shè)置);
Ignore All Default Libraries,放棄所有默認(rèn)的庫連接; Link Incrementally,通過生成. ILK文件實現(xiàn)遞增式連接以提高后續(xù)連接速度,但一般這種方式下生成的文件(EXE或DLL)較大;
Generate Mapfile,生成.MAP文件記錄模塊相關(guān)信息; Enable Profiling,這個參數(shù)通常與Generate Mapfile參數(shù)同時使用,而且如果產(chǎn)生Debug信息的話,不能用.PDB文件,而且必須用Microsoft Format。
2) Customize 這里可以進(jìn)行使用程序數(shù)據(jù)庫文件的設(shè)置。
Force File Output,強(qiáng)制產(chǎn)生輸出文件(EXE或DLL); Print Progress Messages,可以將連接過程中的進(jìn)度信息輸出到Output窗口。
3) Debug 設(shè)置是否生成調(diào)試信息,以及調(diào)試信息的格式。
Dubug info,格式可以有Microsoft Format、COFF Format(Common Object File Format)和Both Formats三種選擇;
Separate Types,表示將Debug格式信息以獨(dú)立的.PDB文件存放,還是直接放在各個源文件的.PDB文件中。選中的話,表示采用后者的方式,這種方式調(diào)試啟動比較快。
4) Input 這里可以指定要連接的庫文件,放棄連接的庫文件。還可以增加額外的庫文件目錄,一般是相對于本項目的目錄,如..Lib。
Force Symbol References,可以指定連接特定符號定義的庫。
5) Output
Base Address 可以改變程序默認(rèn)的基地址(EXE文件默認(rèn)為0x400000,DLL默認(rèn)為0x10000000),操作系統(tǒng)裝載一個程序時總是試著先從這個基地址開始。
Entry-Point Symbol 可以指定程序的入口地址,一般為一個函數(shù)名(且必須采用__stdcall調(diào)用約定)。一般Win32的程序,EXE的入口為 WinMain,DLL的入口為DllEntryPoint;最好讓連接器自動設(shè)置程序的入口點。默認(rèn)情況下,通過一個C的運(yùn)行時庫函數(shù)來實現(xiàn):控制臺程序采用mainCRTStartup (或wmainCRTStartup)去調(diào)用程序的main (或wmain)函數(shù);Windows程序采用WinMainCRTStartup
(或 wWinMainCRTStartup)調(diào)用程序的WinMain (或 wWinMain,必須采用__stdcall調(diào)用約定);DLL采用_DllMainCRTStartup調(diào)用DllMain函數(shù)(必須采用 __stdcall調(diào)用約定)。
Stack allocations 用以設(shè)置程序使用的堆棧大?。ㄕ埵褂檬M(jìn)制),默認(rèn)為1兆字節(jié)。 Version Information 告訴連接器在EXE或DLL文件的開始部分放上版本號。
值得注意的是:
上面各個參數(shù)是大小寫敏感的; 在參數(shù)后加上"-"表示該參數(shù)無效; 各個參數(shù)值選項有"*"的表示為該參數(shù)的默認(rèn)值; 可以使用頁右上角的"Reset"按鈕來恢復(fù)該頁的所有默認(rèn)設(shè)置。
其它一些參數(shù)設(shè)置。
1) Project->Settings->General,可以設(shè)置連接MFC庫的方式(靜態(tài)或動態(tài))。如果是動態(tài)連接,在MFC軟件發(fā)布時不要忘了帶上MFC的DLL。
2) Project->Settings->Debug,可以設(shè)置調(diào)試時運(yùn)行的可執(zhí)行文件,以及命令行參數(shù)等。
3) Project->Settings->Custom Build,可以設(shè)置編譯/連接成功后自動執(zhí)行一些操作。比較有用的是,寫COM時希望VC對編譯通過的COM文件自動注冊,可以如下設(shè)置:
Description: Register COM
Commands: regsvr32 /s /c $(TargetPath)
echo regsvr32 exe.time > $(TargetDir)$(TargetName).trg
Outputs: $(TargetDir)$(TargetName).trg
4) Tools->Options->Directories,設(shè)置系統(tǒng)的Include、Library路徑。
CL.exe的全部命令開關(guān)
/C:在預(yù)處理輸出中保留注釋語句
/c:只編譯,不連接,相當(dāng)于在"Build"菜單下選擇了"Compile"
/D:定義常量和宏,與源程序里的#define 有相同效果
/E:預(yù)處理C、C++源文件,將源文件中所有的預(yù)編譯指令及宏展開,將注釋去掉,然后將預(yù)處理器的輸出拷貝至標(biāo)準(zhǔn)輸出設(shè)備輸出,并且在每個文件的開頭和末尾加入#line
/EH:指定編譯器用何種異常處理模型
/EP:同/E,只是去掉了#line
/F:設(shè)置程序的堆棧大小
/FA:設(shè)置生成何種列表文件(匯編、匯編與機(jī)器碼、匯編與源碼、匯編與機(jī)器碼以及源碼)
/Fa:指定用/FA設(shè)置的列表文件的存放路徑及(或)文件名
/FD:生成文件的相互依賴信息
/Fd:設(shè)置程序數(shù)據(jù)庫文件(PDB)的存放路徑及(或)文件名
/Fe:設(shè)置最終可執(zhí)行文件的存放路徑及(或)文件名
/FI:預(yù)處理指定的頭文件,與源文件中的#include有相同效果
/Fm:創(chuàng)建map文件
/Fo:設(shè)置編譯后Obj文件的存放路徑及(或)文件名
/Fp:設(shè)置預(yù)編譯文件(pch)的存放路徑及(或)文件名
/FR:生成瀏覽信息(sbr)文件
/Fr:同/FR,不同之處在于/Fr不包括局部變量信息
/G3:為80386處理器優(yōu)化代碼生成
/G4:為80486處理器優(yōu)化代碼生成
/G5:為Pentium處理器優(yōu)化代碼生成
/G6:為Pentium Pro處理器優(yōu)化代碼生成
/GA:為Windows應(yīng)用程序作優(yōu)化
/GB:為Pentium處理器優(yōu)化代碼生成,使用80386、80486、Pentium、Pentium Pro的混合指令集,是代碼生成的默認(rèn)選項(程序?qū)傩赃x項中Processor對應(yīng)Blend)
/GD:為Windows動態(tài)庫(dll)作優(yōu)化,此開關(guān)在VC6中沒有實現(xiàn)
/Gd:指定使用__cdecl的函數(shù)調(diào)用規(guī)則
/Ge:激活堆棧檢測
/GF:消除程序中的重復(fù)的字符串,并將她放到只讀的緩沖區(qū)中
/Gf:消除程序中的重復(fù)字符串
/Gh:在每個函數(shù)的開頭調(diào)用鉤子(hook)函數(shù)--penter
/Gi:允許漸進(jìn)編譯
/Gm:允許最小化rebuild
/GR:允許運(yùn)行時類型信息(Run-Time Type Infomation)
/Gr:指定使用__fastcall的函數(shù)調(diào)用規(guī)則
/Gs:控制堆棧檢測所用內(nèi)存大小
/GT:支持用__declspec(thread)分配的數(shù)據(jù)的fier-safety
/GX:允許同步異常處理,與/EHsc開關(guān)等價
/Gy:允許編譯器將每一個函數(shù)封裝成COMDATs的形式,供連接器調(diào)用
/GZ:允許在Debug build 的時候捕捉Release build的錯誤
/Gz:指定使用__stdcall的函數(shù)調(diào)用規(guī)則
/H:限制外部名字的長度
/HELP:列出編譯器的所有的命令開關(guān)
/I:指定頭文件的搜索路徑
/J:將char的缺省類型從signed char改成unsigned char
/LD:創(chuàng)建一個動態(tài)連接庫
/LDd:創(chuàng)建一個Debug版本的動態(tài)鏈接庫
/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:不顯示程序的版權(quán)信息
/O1:優(yōu)化使產(chǎn)生的可執(zhí)行代碼最小
/O2:優(yōu)化使產(chǎn)生的可執(zhí)行代碼速度最快
/Oa:指示編譯器程序里沒有使用別名,可以提高程序的執(zhí)行速度
/Ob:控制內(nèi)聯(lián)(inline)函數(shù)的展開
/Od:禁止代碼優(yōu)化
/Og:使用全局優(yōu)化
/Oi:用內(nèi)部函數(shù)去代替程序里的函數(shù)調(diào)用,可以使程序運(yùn)行的更快,但程序的長度變長
/Op:提高浮點數(shù)比較運(yùn)算的一致性
/Os:產(chǎn)生盡可能小的可執(zhí)行代碼
/Ot:產(chǎn)生盡可能塊的可執(zhí)行代碼
/Ow:指示編譯器在函數(shù)體內(nèi)部沒有使用別名
/Ox:組合了幾個優(yōu)化開關(guān),達(dá)到盡可能多的優(yōu)化
/Oy:阻止調(diào)用堆棧里創(chuàng)建幀指針
/Q1f:對核心級的設(shè)備驅(qū)動程序生成單獨(dú)的調(diào)試信息
/QI0f:對Pentium 0x0f錯誤指令作修正
/Qifdiv:對Pentium FDIV錯誤指令作修正
/P:將預(yù)處理輸出寫到指定文件里,文件的后綴名為I
/TC:將命令行上的所有文件都當(dāng)作C源程序編譯,不管后綴名是否為.c
/Tc:將指定的文件當(dāng)作C源程序編譯,不管后綴名是否為.c
/TP:將命令行上的所有文件都當(dāng)作C++源程序編譯,不管后綴名是否為.cpp
/Tp:將指定文件當(dāng)作C++源程序編譯,不管后綴名是否為.cpp
/U:去掉一個指定的前面定義的符號或常量
/u:去掉所有前面定義的符號或常量
/V:在編譯的obj文件里嵌入版本號
/vd:禁止/允許構(gòu)造函數(shù)置換
/vmb:選擇指針的表示方法,使用這個開關(guān),在聲明指向某個類的成員的指針之前,必須先定義這個類
/vmg:選擇指針的表示方法,使用這個開關(guān),在聲明指向某個類的成員的指針之前,不必先定義這個類,但要首先指定這個類是使用何種繼承方法
/vmm:設(shè)置指針的表示方法為Single Inheritance and Multiple Inheritance
/vms:設(shè)置指針的表示方法為Single Inheritance
/vmv:設(shè)置指針的表示方法為Any class
/W:設(shè)置警告等級
/w:禁止所有警告
/X:阻止編譯器搜索標(biāo)準(zhǔn)的include 目錄
/Yc:創(chuàng)建預(yù)編譯頭文件(pch)
/Yd:在所有的obj文件里寫上完全的調(diào)試信息
/Yu:在build過程中使用指定的預(yù)編譯頭文件
/YX:指示編譯器若預(yù)編譯頭文件存在,則使用它,若不存在,則創(chuàng)建一個
/Z7:生成MSC7.0兼容的調(diào)試信息
/Za:禁止語言擴(kuò)展(Microsoft Extensions to C)
/Zd:調(diào)試信息只包含外部和全局的符號信息以及行號信息
/Ze:允許語言擴(kuò)展(Microsoft Extensions to C)
/Zg:為源文件里面定義的每個函數(shù)生成函數(shù)原型
/ZI:生成程序庫文件(Pdb)并支持Edit and Continue調(diào)試特性
/Zi:生成程序庫文件(pdb),包含類型信息和符號調(diào)試信息
/ZL:從obj文件里去掉缺省的庫文件名
/Zm:設(shè)置編譯器的內(nèi)存分配xianzhi
/Zn:禁止瀏覽信息文件里面的封裝
/Zp:設(shè)置結(jié)構(gòu)成員在內(nèi)存里面的封裝格式
/Zs:快速檢查語法錯誤???
一些小竅門
1) 有時候,你可能在編譯的時候,計算機(jī)突然非法關(guān)機(jī)了(可能某人不小心碰了電源或你的內(nèi)存不穩(wěn)定等原因)。當(dāng)你重啟機(jī)器后打開剛才的項目,重新進(jìn)行編譯,發(fā)現(xiàn)VC會崩掉。你或許以為你的VC編譯器壞了,其實不然(你試試編譯其它項目,還是好的?。阒灰獙㈨椖康?ncb、.opt、.aps、.clw文件以及Debug、Release目錄下的所有文件都刪掉,然后重新編譯就行了。
2) 如果你想與別人共享你的源代碼項目,但是把整個項目做拷貝又太大。你完全可以刪掉以下文件:.dsw、.ncb、.opt、.aps、.clw、. plg文件以及Debug、Release目錄下的所有文件。
3) 當(dāng)你的Workspace中包含多個Project的時候,你可能不能直觀地、一眼看出來哪個是當(dāng)前項目??梢匀缦略O(shè)置:Tools-> Options->Format,然后在Category中選擇Workspace window,改變其默認(rèn)的字體(比如設(shè)成Fixedsys)就行了。
4) 如何給已有的Project改名字?將該P(yáng)roject關(guān)掉。然后以文本格式打開.dsp文件,替換原來的Project名字即可。
5) VC6對類成員的智能提示功能很有用,但有時候會失靈。你可以先關(guān)掉項目,將.clw和.ncb刪掉,然后重新打開項目,點擊菜單項View-> ClassWizard,在彈出的對話框中按一下"Add All"按鈕;重新Rebuild All。應(yīng)該可以解決問題