VC6.0編譯器參數(shù)的設置主要通過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
各個參數(shù)代表的意義,可以參考Msdn。比如/nologo表示編譯時不在輸出窗口顯示這些設置(我們可以把這個參數(shù)去掉來看看效果)等等。一般我們不會直接修改這些設置,而是通過這一頁最上面的Category中的各項來完成......
-轉載-
主要通過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
各個參數(shù)代表的意義,可以參考Msdn。比如/nologo表示編譯時不在輸出窗口顯示這些設置(我們可以把這個參數(shù)去掉來看看效果)等等。一般我們不會直接修改這些設置,而是通過這一頁最上面的Category中的各項來完成。
1) General:一些總體設置。
Warning level 用來控制警告信息,其中Level 1是最嚴重的級別;
Warnings as errors 將警告信息當作錯誤處理;
Optimizations 代碼優(yōu)化,可以在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,創(chuàng)建.PDB文件記錄所有調試信息;
Program Database for "Edit & Continue",創(chuàng)建.PDB文件記錄所有調試信息,并且支持調試時編輯。
2) C++ Language
Pointer-to-member representation 用來設置類定義/引用的先后關系:
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,進行同步的異常處理;
Enable Run-Time Type Information 迫使編譯器增加代碼在運行時進行對象類型檢查;
Disable Construction Displacements 設置類構造/析構函數(shù)調用虛函數(shù)問題。
3) Code Generation
Processor 表示代碼指令優(yōu)化,可以為80386、80486、Pentium、Pentium Pro,或者Blend表示混合以上各種優(yōu)化。
Use run-time library 用以指定程序運行時使用的運行時庫,有一個原則就是,一個進程不要同時使用幾個版本的運行時庫。連接了單線程庫就不支持多線程調用,連接了多線程庫就要求創(chuà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 可以用來設定調用約定,有三種:__cdecl、__fastcall和__stdcall。
各種調用約定的主要區(qū)別在于:1. 函數(shù)調用時,函數(shù)的參數(shù)是從左到右壓入堆棧還是從右到左壓入堆棧;2. 在函數(shù)返回時,由函數(shù)的調用者來清理壓入堆棧的參數(shù)還是由函數(shù)本身來清理;3. 以及在編譯時對函數(shù)名進行的命名修飾(可以通過Listing Files看到各種命名修飾方式)。
Struct member alignment 用以指定數(shù)據(jù)結構中的成員變量在內存中是按幾字節(jié)對齊的,根據(jù)計算機數(shù)據(jù)總線的位數(shù),不同的對齊方式存取數(shù)據(jù)的速度不一樣。這個參數(shù)對數(shù)據(jù)包網(wǎng)絡傳輸?shù)葢糜葹橹匾皇谴嫒∷俣葐栴},而是數(shù)據(jù)位的精確定義問題,一般在程序中使用#pragma pack來指定。
4) Customize
Disable Language Extensions,表示不使用微軟為標準C做的語言擴展;
Eliminate Duplicate Strings,主要用于字符串優(yōu)化(將字符串放到緩充池里以節(jié)省空間),使用這個參數(shù),使得
char *sBuffer = "This is a character buffer";
char *tBuffer = "This is a character buffer";
sBuffer 和tBuffer指向的是同一塊內存空間;
Enable Function-Level Linking ,告訴編譯器將各個函數(shù)按打包格式編譯;
Enables minimal rebuild,通過保存關聯(lián)信息到.IDB文件,使編譯器只對最新類定義改動過的源文件進行重編譯,提高編譯速度;
Enable Incremental Compilation,同樣通過.IDB文件保存的信息,只重編譯最新改動過的函數(shù);
Suppress Startup Banner and Information Messages,用以控制參數(shù)是否在output窗口輸出。
5) Listing Files
Generate browse info 上面已經(jīng)提到過。這里可以進行更多的設置。
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 代碼優(yōu)化設置。
Maximize Speed 生成最快速的代碼;
Minimize Size 生成最小尺寸的程序;
Customize 定制優(yōu)化。定制的內容包括:
Assume No Aliasing,不使用別名(提高速度);
Assume Aliasing Across Function Calls,僅函數(shù)內部不使用別名;
Global Optimizations,全局優(yōu)化,比如經(jīng)常用到的變量使用寄存器保存,或者循環(huán)內的計算優(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,使用內部函數(shù)替換一些函數(shù)調用(提高速度);
Improve Float Consistency,浮點運算方面的優(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ù)調用速度;
Full Optimization,組合了幾種參數(shù),以生成最快的程序代碼。
Inline function expansion,內聯(lián)函數(shù)擴展的三種優(yōu)化(使用內聯(lián)可以節(jié)省函數(shù)調用的開銷,加快程序速度):
Disable,不使用內聯(lián);
Only __inline,僅函數(shù)定義前有inline或__inline標記使用內聯(lián);
Any Suitable,除了inline或__inline標記的函數(shù)外,編譯器"覺得"應該使用內聯(lián)的函數(shù),都使用內聯(lián)。
7) Precompiled Headers 預編譯頭文件的設置。使用預編譯可以提高重復編譯的速度。VC一般將一些公共的、不大變動的頭文件(比如afxwin.h等)集中放到stdafx.h中,這一部分代碼就不必每次都重新編譯(除非是Rebuild All)。
8) Preprocessor 預編譯處理。可以定義/解除定義一些常量。
Additional include directories,可以指定額外的包含目錄,一般是相對于本項目的目錄,如..\Include。
--------------------------------------------------------------------------------
連接參數(shù)的設置
主要通過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文件實現(xiàn)遞增式連接以提高后續(xù)連接速度,但一般這種方式下生成的文件(EXE或DLL)較大;
Generate Mapfile,生成.MAP文件記錄模塊相關信息;
Enable Profiling,這個參數(shù)通常與Generate Mapfile參數(shù)同時使用,而且如果產生Debug信息的話,不能用.PDB文件,而且必須用Microsoft Format。
2) Customize 這里可以進行使用程序數(shù)據(jù)庫文件的設置。
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),操作系統(tǒng)裝載一個程序時總是試著先從這個基地址開始。
Entry-Point Symbol 可以指定程序的入口地址,一般為一個函數(shù)名(且必須采用__stdcall調用約定)。一般Win32的程序,EXE的入口為 WinMain,DLL的入口為DllEntryPoint;最好讓連接器自動設置程序的入口點。默認情況下,通過一個C的運行時庫函數(shù)來實現(xiàn):控制臺程序采用mainCRTStartup (或wmainCRTStartup)去調用程序的main (或wmain)函數(shù);Windows程序采用WinMainCRTStartup (或 wWinMainCRTStartup)調用程序的WinMain (或 wWinMain,必須采用__stdcall調用約定);DLL采用_DllMainCRTStartup調用DllMain函數(shù)(必須采用 __stdcall調用約定)。
Stack allocations 用以設置程序使用的堆棧大小(請使用十進制),默認為1兆字節(jié)。
Version Information 告訴連接器在EXE或DLL文件的開始部分放上版本號。
值得注意的是:
上面各個參數(shù)是大小寫敏感的;
在參數(shù)后加上"-"表示該參數(shù)無效;
各個參數(shù)值選項有"*"的表示為該參數(shù)的默認值;
可以使用頁右上角的"Reset"按鈕來恢復該頁的所有默認設置。
--------------------------------------------------------------------------------
其它一些參數(shù)設置。
1) Project->Settings->General,可以設置連接MFC庫的方式(靜態(tài)或動態(tài))。如果是動態(tài)連接,在MFC軟件發(fā)布時不要忘了帶上MFC的DLL。
2) Project->Settings->Debug,可以設置調試時運行的可執(zhí)行文件,以及命令行參數(shù)等。
3) Project->Settings->Custom Build,可以設置編譯/連接成功后自動執(zhí)行一些操作。比較有用的是,寫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,設置系統(tǒng)的Include、Library路徑。
--------------------------------------------------------------------------------
小竅門: 項目中的.ncb、.opt、.aps、.clw文件以及Debug、Release目錄下的所有文件都可以刪掉的。