VC6.0編譯器參數的設定

來源:互聯網
上載者:User

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中的各項來完成......
-轉載-

主要通過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 表示代碼指令最佳化,可以為8038680486PentiumPentium 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 FormatCOFF 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 用以設定程式使用的堆棧大小(請使用十進位),預設為1MB。
  • 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路徑。

一些小竅門

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。應該可以解決問題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.