小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

(轉(zhuǎn)載)VC編譯器命令行詳解

 共同成長888 2017-09-07

CL   命令行使用下列語法: 
  
  CL   [option...]   file...   [option    file]...   [lib...]   [@command-file]   [/link   link-opt...]
 
  下表說明CL   命令的輸入項(xiàng)意義  
 
  option   一個(gè)或多個(gè)   CL   選項(xiàng)。請(qǐng)注意,所有選項(xiàng)都應(yīng)用于所有指定的源文件。選項(xiàng)是由一個(gè)正斜杠   (/)   或一個(gè)短劃線   (–)   指定的。如果某個(gè)選項(xiàng)帶有參數(shù),則該選項(xiàng)的說明指定在選項(xiàng)和參數(shù)之間是否允許有空格。選項(xiàng)名(/HELP   選項(xiàng)除外)區(qū)分大小寫。有關(guān)更多信息,請(qǐng)參閱   CL   選項(xiàng)的順序。    
 
  file   一個(gè)或多個(gè)源文件、.obj   文件或庫的名稱。CL   編譯源文件并將   .obj   文件和庫的名稱傳遞給鏈接器。有關(guān)更多信息,請(qǐng)參閱   CL   文件名語法。    
 
  lib   一個(gè)或多個(gè)庫名。CL   將這些名稱傳遞給鏈接器。  
 
  command-file   包含多個(gè)選項(xiàng)和文件名的文件。有關(guān)更多信息,請(qǐng)參閱   CL   命令文件。  
 
  link-opt   一個(gè)或多個(gè)鏈接器選項(xiàng)。CL   將這些選項(xiàng)傳遞給鏈接器。  
 
  您可以指定任意數(shù)目的選項(xiàng)、文件名和庫名,條件是命令行上的字符數(shù)不超過   1024,該限制是操作系統(tǒng)指定的。 

大家可能一直在用VC開發(fā)軟件,但是對(duì)于這個(gè)編譯器卻未必很了解。原因是多方面的。大多數(shù)情況下,我們只停留在“使用”它,而不會(huì)想去“了解”它。因?yàn)樗皇且粋€(gè)工具,我們寧可把更多的精力放在C++語言和軟件設(shè)計(jì)上。我們習(xí)慣于這樣一種“模式”:建立一個(gè)項(xiàng)目,然后寫代碼,然后編譯,反反復(fù)復(fù)調(diào)試。但是,所謂:“公欲善其事,必先利其器”。如果我們精于VC開發(fā)環(huán)境,我們是不是能夠做得更加游刃有余呢?

    閑話少說。我們先來看一下VC的處理流程,大致分為兩步:編譯和連接。源文件通過編譯生成了。obj文件;所有。obj文件和。lib文件通過連接生成。exe文件或。dll文件。下面,我們分別討論這兩個(gè)步驟的一些細(xì)節(jié)。

    編譯參數(shù)的設(shè)置。主要通過VC的菜單項(xiàng)Project->Settings->C/C++頁來完成。我們可以看到這一頁的最下面Project Options中的內(nèi)容,一般如下:

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

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

    1) General:一些總體設(shè)置。Warning level用來控制警告信息,其中Level 1是最嚴(yán)重的級(jí)別;Warnings as errors將警告信息當(dāng)作錯(cuò)誤處理;Optimizations是代碼優(yōu)化,可以在Category的Optimizations項(xiàng)中進(jìn)行更細(xì)的設(shè)置;Generate browse info用以生成。sbr文件,記錄類、變量等符號(hào)信息,可以在Category的Listing Files項(xiàng)中進(jìn)行更多的設(shè)置。Debug info,生成調(diào)試信息:None,不產(chǎn)生任何調(diào)試信息(編譯比較快);Line Numbers Only,僅生成全局的和外部符號(hào)的調(diào)試信息到。OBJ文件或。EXE文件,減小目標(biāo)文件的尺寸;C 7.0- Compatible,記錄調(diào)試器用到的所有符號(hào)信息到。OBJ文件和。EXE文件;Program Database,創(chuàng)建。PDB文件記錄所有調(diào)試信息;Program Database for "Edit & Continue",創(chuàng)建。PDB文件記錄所有調(diào)試信息,并且支持調(diào)試時(shí)編輯。

    2) C++ Language:pointer_to_member representation用來設(shè)置類定義/引用的先后關(guān)系,一般為Best-Case Always表示在引用類之前該類肯定已經(jīng)定義了;Enable Exception Handling,進(jìn)行同步的異常處理;Enable Run-Time Type Information迫使編譯器增加代碼在運(yùn)行時(shí)進(jìn)行對(duì)象類型檢查;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)行時(shí)使用的運(yùn)行時(shí)庫(單線程或多線程,Debug版本或Release版本),有一個(gè)原則就是,一個(gè)進(jìn)程不要同時(shí)使用幾個(gè)版本的運(yùn)行時(shí)庫。Single-Threaded,靜態(tài)連接LIBC.LIB庫;Debug Single-Threaded,靜態(tài)連接LIBCD.LIB庫;Multithreaded,靜態(tài)連接LIBCMT.LIB庫;Debug Multithreaded,靜態(tài)連接LIBCMTD.LIB庫;Multithreaded DLL,動(dòng)態(tài)連接MSVCRT.DLL庫;Debug Multithreaded DLL,動(dòng)態(tài)連接MSVCRTD.DLL庫。連接了單線程庫就不支持多線程調(diào)用,連接了多線程庫就要求創(chuàng)建多線程的應(yīng)用程序。

    Calling convention可以用來設(shè)定調(diào)用約定,有三種:__cdecl、__fastcall和__stdcall.各種調(diào)用約定的主要區(qū)別在于,函數(shù)調(diào)用時(shí),函數(shù)的參數(shù)是從左到右壓入堆棧還是從右到左壓入堆棧;在函數(shù)返回時(shí),由函數(shù)的調(diào)用者來清理壓入堆棧的參數(shù)還是由函數(shù)本身來清理;以及在編譯時(shí)對(duì)函數(shù)名進(jìn)行的命名修飾(可以通過Listing Files看到各種命名修飾方式)。Struct member alignment用以指定數(shù)據(jù)結(jié)構(gòu)中的成員變量在內(nèi)存中是按幾字節(jié)對(duì)齊的,根據(jù)計(jì)算機(jī)數(shù)據(jù)總線的位數(shù),不同的對(duì)齊方式存取數(shù)據(jù)的速度不一樣。這個(gè)參數(shù)對(duì)數(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é)省空間),使用這個(gè)參數(shù),使得

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

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

    sBuffer和tBuffer指向的是同一塊內(nèi)存空間;Enable Function-Level Linking ,告訴編譯器將各個(gè)函數(shù)按打包格式編譯;Enables minimal rebuild,通過保存關(guān)聯(lián)信息到。IDB文件,使編譯器只對(duì)最新類定義改動(dòng)過的源文件進(jìn)行重編譯,提高編譯速度;Enable Incremental Compilation,同樣通過。IDB文件保存的信息,只重編譯最新改動(dòng)過的函數(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目錄下,生成的文件名自動(dòng)取源文件的文件名。

    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)的計(jì)算優(yōu)化,如

    i = -100;

    while( i < 0 ){ i += x + y;}

    會(huì)被優(yōu)化為

    i = -100;

    t = x + y;

    while( i < 0 ){i += t;}

    Generate Intrinsic Functions,使用內(nèi)部函數(shù)替換一些函數(shù)調(diào)用(提高速度);

    Improve Float Consistency,浮點(diǎn)運(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一般將一些公共的、不大變動(dòng)的頭文件(比如afxwin.h等)集中放到 stdafx.h中,這一部分代碼就不必每次都重新編譯(除非是Rebuild All)。

    8) Preprocessor:預(yù)編譯處理??梢远x/解除定義一些常量。Additional include directories,可以指定額外的包含目錄,一般是相對(duì)于本項(xiàng)目的目錄,如……\Include.

    連接參數(shù)的設(shè)置。主要通過VC的菜單項(xiàng)Project->Settings->Link頁來完成。我們可以看到這一頁的最下面Project Options中的內(nèi)容,一般如下:

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

    下面我們分別來看一下Category中的各項(xiàng)設(shè)置。

    1) General:一些總體設(shè)置??梢栽O(shè)置生成的文件路徑、文件名;連接的庫文件;Generate debug info,生成Debug信息到。PDB文件(具體格式可以在Category->Debug中設(shè)置);Ignore All Default Libraries,放棄所有默認(rèn)的庫連接;Link Incrementally,通過生成。 ILK文件實(shí)現(xiàn)遞增式連接以提高后續(xù)連接速度,但一般這種方式下生成的文件(EXE或DLL)較大;Generate Mapfile,生成。MAP文件記錄模塊相關(guān)信息;Enable Profiling,這個(gè)參數(shù)通常與Generate Mapfile參數(shù)同時(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)試信息的格式。格式可以有Microsoft Format、COFF Format(Common Object File Format)和Both Formats三種選擇;Separate Types,表示將Debug格式信息以獨(dú)立的。PDB文件存放,還是直接放在各個(gè)源文件的。PDB文件中。選中的話,表示采用后者的方式,這種方式調(diào)試啟動(dòng)比較快。

    4) Input:這里可以指定要連接的庫文件,放棄連接的庫文件。還可以增加額外的庫文件目錄,一般是相對(duì)于本項(xiàng)目的目錄,如……\Lib.Force Symbol References,可以指定連接特定符號(hào)定義的庫。

    5) Output:Base Address可以改變程序默認(rèn)的基地址(EXE文件默認(rèn)為0x400000,DLL默認(rèn)為x10000000),操作系統(tǒng)裝載一個(gè)程序時(shí)總是試著先從這個(gè)基地址開始。Entry-Point Symbol可以指定程序的入口地址,一般為一個(gè)函數(shù)名(且必須采用__stdcall調(diào)用約定)。一般Win32的程序,EXE的入口為 WinMain,DLL的入口為DllEntryPoint;最好讓連接器自動(dòng)設(shè)置程序的入口點(diǎn)。默認(rèn)情況下,通過一個(gè)C的運(yùn)行時(shí)庫函數(shù)來實(shí)現(xiàn):控制臺(tái)程序采用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è)置程序使用的堆棧大小(請(qǐng)使用十進(jìn)制),默認(rèn)為1兆字節(jié)。Version Information告訴連接器在EXE或DLL文件的開始部分放上版本號(hào)。

    值得注意的是,上面各個(gè)參數(shù)是大小寫敏感的;在參數(shù)后加上“-”表示該參數(shù)無效;各個(gè)參數(shù)值選項(xiàng)有“*”的表示為該參數(shù)的默認(rèn)值;可以使用頁右上角的“Reset”按鈕來恢復(fù)該頁的所有默認(rèn)設(shè)置。

    其它一些參數(shù)設(shè)置

    1) Project->Settings->General,可以設(shè)置連接MFC庫的方式(靜態(tài)或動(dòng)態(tài))。如果是動(dòng)態(tài)連接,在你的軟件發(fā)布時(shí)不要忘了帶上MFC的DLL.

    2) Project->Settings->Debug,可以設(shè)置調(diào)試時(shí)運(yùn)行的可執(zhí)行文件,以及命令行參數(shù)等。

    3) Project->Settings->Custom Build,可以設(shè)置編譯/連接成功后自動(dòng)執(zhí)行一些操作。比較有用的是,寫COM時(shí)希望VC對(duì)編譯通過的COM文件自動(dòng)注冊(cè),可以如下設(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路徑。

    一些小竅門

    1)有時(shí)候,你可能在編譯的時(shí)候,計(jì)算機(jī)突然非法關(guān)機(jī)了(可能某人不小心碰了電源或你的內(nèi)存不穩(wěn)定等原因)。當(dāng)你重啟機(jī)器后打開剛才的項(xiàng)目,重新進(jìn)行編譯,發(fā)現(xiàn)VC會(huì)崩掉。你或許以為你的VC編譯器壞了,其實(shí)不然(你試試編譯其它項(xiàng)目,還是好的?。?,你只要將項(xiàng)目的。ncb、。opt、。aps、。clw文件以及Debug、Release目錄下的所有文件都刪掉,然后重新編譯就行了。

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

    3)當(dāng)你的Workspace中包含多個(gè)Project的時(shí)候,你可能不能直觀地、一眼看出來哪個(gè)是當(dāng)前項(xià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對(duì)類成員的智能提示功能很有用,但有時(shí)候會(huì)失靈。你可以先關(guān)掉項(xiàng)目,將。clw和。ncb刪掉,然后重新打開項(xiàng)目,點(diǎn)擊菜單項(xiàng) View->ClassWizard,在彈出的對(duì)話框中按一下“Add All”按鈕;重新Rebuild All.應(yīng)該可以解決問題。
1.基于對(duì)話框(/單文檔/多文檔)的MFC程序
預(yù)編譯頭文件stdafx.h:
#define VC_EXTRALEAN     // Exclude rarely-used stuff from Windows headers

// afxwin.h中聲明了MFC封裝的一些很基本的類(CWnd、CView、CButton、CDC等)
#include <afxwin.h>         // MFC core and standard components
// afxext.h中聲明了MFC的一些擴(kuò)展類(CBitmapButton、CControlBar、CSplitterWnd等)
#include <afxext.h>         // MFC extensions
// afxdisp.h中聲明了Ole的幾個(gè)類(COleException、COleVariant等)
#include <afxdisp.h>        // MFC Automation classes
// afxdtctl.h中聲明了幾個(gè)控件類(CImageList、CMonthCalCtrl、CDateTimeCtrl等)
#include <afxdtctl.h>       // MFC support for Internet Explorer 4 Common Controls

#ifndef _AFX_NO_AFXCMN_SUPPORT
// afxcmn.h中聲明了MFC常用的一些控件類(CListCtrl、CProgressCtrl、CToolTipCtrl等)
#include <afxcmn.h>            // MFC support for Windows Common Controls
#endif // _AFX_NO_AFXCMN_SUPPORT

(1.1)Use MFC in a Shared DLL
Debug版本:
預(yù)定義:WIN32,_DEBUG,_WINDOWS,_AFXDLL,_MBCS
編譯參數(shù):/nologo /MDd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_AFXDLL" /D "_MBCS" /FR"Debug/" /Fp"Debug/ExeDlg.pch" /Yu"stdafx.h" /Fo"Debug/" /Fd"Debug/" /FD /GZ   /c
連接參數(shù):/nologo /subsystem:windows /incremental:yes /pdb:"Debug/ExeDlg.pdb" /debug /machine:I386 /out:"Debug/ExeDlg.exe" /pdbtype:sept

Release版本:
預(yù)定義:與Debug版本相比,將_DEBUG替換成了NDEBUG
編譯參數(shù):/nologo /MD /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_AFXDLL" /D "_MBCS" /Fp"Release/ExeDlg.pch" /Yu"stdafx.h" /Fo"Release/" /Fd"Release/" /FD /c
連接參數(shù):/nologo /subsystem:windows /incremental:no /pdb:"Release/ExeDlg.pdb" /machine:I386 /out:"Release/ExeDlg.exe"

(1.2)Use MFC in a Static Library
Debug版本:
預(yù)定義:與(1.1)相比,少了_AFXDLL
編譯參數(shù):將/MDd(使用Run-time library: Debug Multithreaded DLL)換成了/MTd(使用Run-time library: Debug Multithreaded)
連接參數(shù):與(1.1)相同

Release版本:
編譯參數(shù)/MD(使用Run-time library: Multithreaded DLL)換成了MT(使用Run-time library: Multithreaded)

***備注:以上編譯/連接參數(shù)含義如下(更多的,請(qǐng)參考Msdn):
/nologo:抑制信息在編譯或者連接時(shí)在Output Window輸出;   /MD:運(yùn)行時(shí)庫使用MSVCRT.DLL;   /W3:編譯時(shí)顯示為Warning的級(jí)別為3;   /Gm:Enable Minimal Rebuild,一種減少重編譯的選項(xiàng);  /GX:Enable Exception Handling;     /ZI:設(shè)置Debug信息保存的數(shù)據(jù)庫文件.PDB中;    /Od:Disable代碼優(yōu)化;     /FR:生成.SBR文件,包含有符號(hào)信息;       /Fp:命名生成的預(yù)編譯頭文件;     /Yu:指定預(yù)編譯頭文件。

 


/////////////////////////////////////////////////////////////////////////////////
2.MFC DLL項(xiàng)目
預(yù)編譯頭文件stdafx.h:
#define VC_EXTRALEAN        // Exclude rarely-used stuff from Windows headers

#include <afxwin.h>         // MFC core and standard components
#include <afxext.h>         // MFC extensions

#ifndef _AFX_NO_OLE_SUPPORT
#include <afxole.h>         // MFC OLE classes
#include <afxodlgs.h>       // MFC OLE dialog classes
#include <afxdisp.h>        // MFC Automation classes
#endif // _AFX_NO_OLE_SUPPORT


#ifndef _AFX_NO_DB_SUPPORT
#include <afxdb.h>            // MFC ODBC database classes
#endif // _AFX_NO_DB_SUPPORT

#ifndef _AFX_NO_DAO_SUPPORT
#include <afxdao.h>            // MFC DAO database classes
#endif // _AFX_NO_DAO_SUPPORT

#include <afxdtctl.h>        // MFC support for Internet Explorer 4 Common Controls
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h>            // MFC support for Windows Common Controls
#endif // _AFX_NO_AFXCMN_SUPPORT
增加了兩個(gè)OLE的頭文件和兩個(gè)數(shù)據(jù)庫的頭文件

(2.1) Use MFC in a Shared DLL
Debug版本:
預(yù)定義:WIN32,_DEBUG,_WINDOWS,_WINDLL,_AFXDLL,_MBCS,_USRDLL,與MFC Exe程序相比,增加了_WINDLL和_USRDLL
編譯參數(shù):與MFC Exe沒有太大區(qū)別
連接參數(shù):/nologo /subsystem:windows /dll /incremental:yes /pdb:"Debug/MFCDll.pdb" /debug /machine:I386 /def:".\MFCDll.def" /out:"Debug/MFCDll.dll" /implib:"Debug/MFCDll.lib" /pdbtype:sept
與MFC Exe相比,增加了/dll定義,以及/def:".\MFCDll.def"和/implib:"Debug/MFCDll.lib"。注意:其中MFCDll是測(cè)試的項(xiàng)目名字,非標(biāo)準(zhǔn)DLL名字。
從項(xiàng)目的文件上看,這個(gè)項(xiàng)目比MFC Exe多產(chǎn)生一個(gè).def的文件用于定義導(dǎo)出函數(shù)。

Release版本與Debug版本的區(qū)別類似項(xiàng)目1中的比較(上了_AFXDLL定義)。

(2.2) Use MFC in a Static DLL
與(2.1)的區(qū)別,主要在使用的Run-time library類型上,與項(xiàng)目1中的比較。

 


/////////////////////////////////////////////////////////////////////////////////
3.MFC Extension DLL項(xiàng)目
預(yù)編譯頭文件stdafx.h內(nèi)容與項(xiàng)目2相同。

(3.1) Use MFC in a Shared DLL
Debug版本:
預(yù)定義:WIN32,_DEBUG,_WINDOWS,_MBCS,_AFXEXT,_WINDLL,_AFXDLL,與項(xiàng)目2相比,將_USRDLL換成了_AFXEXT。
編譯參數(shù):與上述項(xiàng)目沒有太大區(qū)別
連接參數(shù):與MFC DLL項(xiàng)目相似

Release版本與Debug版本的區(qū)別類似項(xiàng)目1中的比較(上了_AFXDLL定義)。

(3.2) Use MFC in a Static DLL
類似以上項(xiàng)目的比較。

 


(注:以下項(xiàng)目均以Debug版本論述。)
/////////////////////////////////////////////////////////////////////////////////
4.Win32 DLL項(xiàng)目
預(yù)編譯頭文件stdafx.h:
#define WIN32_LEAN_AND_MEAN        // Exclude rarely-used stuff from Windows headers

#include <windows.h>

出現(xiàn)項(xiàng)目入口函數(shù)DllMain的實(shí)現(xiàn)。

(4.1) Not Using MFC
預(yù)定義:WIN32,_DEBUG,_WINDOWS,_MBCS,_USRDLL,WIN32DLLDEMO_EXPORTS,與項(xiàng)目2(MFC DLL)相比,少了_WINDLL,_AFXDLL,而僅保留了_USRDLL。另外,WIN32DLLDEMO_EXPORTS自定義的導(dǎo)出宏。
編譯參數(shù):沒有太大區(qū)別。
連接參數(shù):kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /incremental:yes /pdb:"Debug/Win32DllDemo.pdb" /debug /machine:I386 /out:"Debug/Win32DllDemo.dll" /implib:"Debug/Win32DllDemo.lib" /pdbtype:sept
與MFC DLL項(xiàng)目相比,多了很多庫的連接,少了/subsystem:windows的定義。

(4.2) Use MFC in a Shared DLL
預(yù)定義:與(4.1)相比,增加了_WINDLL,_AFXDLL的定義
編譯參數(shù):沒有太大區(qū)別。
連接參數(shù):/nologo /dll /incremental:yes /pdb:"Debug/Win32DllDemo.pdb" /debug /machine:I386 /out:"Debug/Win32DllDemo.dll" /implib:"Debug/Win32DllDemo.lib" /pdbtype:sept
可以看出,(4.1) 里連接的很多庫消失了,這時(shí),項(xiàng)目4變成了類似于項(xiàng)目2中的設(shè)置。
*** 但是,編程時(shí)需要注意,項(xiàng)目4的stdafx.h僅包含了<windows.h>,此時(shí)如果要用MFC的類,需要自己加入MFC的幾個(gè)頭文件(<afxwin.h>、<afxext.h>等),并且將#include <windows.h>和DllMain入口函數(shù)注釋掉!

(4.3) Use MFC in a Static DLL
使用MFC DLL的方式Shared和Static之間的區(qū)別與上述項(xiàng)目類似,不再做比較。

 

/////////////////////////////////////////////////////////////////////////////////
5.Win32 Static Library項(xiàng)目
預(yù)編譯頭文件stdafx.h(可能沒有這個(gè)文件):
如果不使用MFC的話,僅僅#define WIN32_LEAN_AND_MEAN,而如果使用MFC,內(nèi)容如下:
#define VC_EXTRALEAN        // Exclude rarely-used stuff from Windows headers

#include <afx.h>
#include <afxwin.h>

(5.1) Not Using MFC   
預(yù)定義:WIN32,_DEBUG,_MBCS,_LIB,新出現(xiàn)了符號(hào)_LIB
編譯參數(shù):/nologo /MLd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /Fp"Debug/W32StaPrehead.pch" /Yu"stdafx.h" /Fo"Debug/" /Fd"Debug/" /FD /GZ  /c
注意到使用的Run-time library參數(shù)為/MLd。
庫參數(shù):這個(gè)項(xiàng)目沒有Link設(shè)置頁,代替的是Library頁,參數(shù)如下:/nologo /out:"Debug\W32StaPrehead.lib"

(5.2) Use MFC in a Shared DLL
預(yù)定義:WIN32,_DEBUG,_WINDOWS,_MBCS,_AFXDLL,與項(xiàng)目1(MFC Exe)設(shè)置相同。
編譯參數(shù):注意使用的Run-time library參數(shù)為/MDd。
庫參數(shù):沒有太大區(qū)別。

(5.3) Use MFC in a Static DLL
編譯參數(shù):注意使用的Run-time library參數(shù)為/MTd。

 

/////////////////////////////////////////////////////////////////////////////////
6.Win32 Application項(xiàng)目
預(yù)編譯頭文件stdafx.h
#define WIN32_LEAN_AND_MEAN    // Exclude rarely-used stuff from Windows headers

// Windows Header Files:
#include <windows.h>

// C RunTime Header Files
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <tchar.h>

出現(xiàn)了Win32程序的入口函數(shù)WinMain。

這個(gè)項(xiàng)目,Project->settings->General中設(shè)置使用MFC的方式,一般設(shè)為Not Using MFC,否則程序結(jié)構(gòu)的改動(dòng)比較大。從Not Using MFC到使用MFC的改變,對(duì)連接的庫的影響類似于項(xiàng)目4(Win32 DLL)。

(6.1) Not Using MFC
預(yù)定義:WIN32,_DEBUG,_WINDOWS,_MBCS
編譯參數(shù):/nologo /MLd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /Fp"Debug/W32StaPrehead.pch" /Yu"stdafx.h" /Fo"Debug/" /Fd"Debug/" /FD /GZ  /c
注意到使用的Run-time library參數(shù)為/MLd。
連接參數(shù): kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /incremental:yes /pdb:"Debug/W32AppDemo.pdb" /debug /machine:I386 /out:"Debug/W32AppDemo.exe" /pdbtype:sept

(6.2) Use MFC in a Shared DLL
編譯參數(shù):注意使用的Run-time library參數(shù)為/MDd。

(6.3) Use MFC in a Static DLL
編譯參數(shù):注意使用的Run-time library參數(shù)為/MTd。

 


小結(jié):
1.MFC的使用方式對(duì)默認(rèn)情況選擇的Run-time library的影響(以Debug版本為例):
Not Using MFC ---〉/MLd: Debug Single-Threaded(靜態(tài)連接LIBCD.LIB庫)
Use MFC in a Shared DLL ---〉/MDd: Debug Multithreaded DLL(動(dòng)態(tài)連接MSVCRTD.DLL庫)
Use MFC in a Static DLL ---〉/MTd: Debug Multithreaded(靜態(tài)連接LIBCMTD.LIB庫)

2.如果不使用MFC,在Link一欄一般會(huì)連接一系列Windows API的庫文件;如果使用MFC,這些連接庫就會(huì)“消失”。

3.Debug版本一般會(huì)有_DEBUG的預(yù)定義,而Release版本則定義NDEBUG。

4.使用Shared MFC和Static MFC相比,前者一般多一個(gè)_AFXDLL的定義。默認(rèn)使用的Run-time Library也不一樣,前者為/MDd,后者為/MTd。

5.MFC的普通DLL項(xiàng)目比MFC的EXE項(xiàng)目,一般多_WINDLL和_USRDLL預(yù)定義;連接參數(shù)多一個(gè)/dll定義。而MFC擴(kuò)展DLL項(xiàng)目與MFC普通DLL項(xiàng)目相比,預(yù)定義將_USRDLL換成了_AFXEXT。

6.不使用MFC的Win32 DLL與MFC DLL相比,預(yù)定義少了_WINDLL和_AFXDLL,而僅保留了_USRDLL。

7.不使用MFC的靜態(tài)庫有_LIB的預(yù)定義。

8.#include <afxwin.h> 和#include <windows.h>不能重復(fù)包含,前者用于MFC程序,后者用于程序。

9.為了去掉Windows頭文件中很少用到的定義,一般在stdafx.h中,Win32程序會(huì)定義#define WIN32_LEAN_AND_MEAN,而MFC程序會(huì)定義#define VC_EXTRALEAN。

10.作為本文的應(yīng)用,改變項(xiàng)目參數(shù)設(shè)置,實(shí)現(xiàn)不同類型項(xiàng)目之間的項(xiàng)目轉(zhuǎn)換,如下:
MFC Exe   <======> MFC DLL
  ||                  ||
  ||                  ||
  ||                  ||
Win32 Exe <======> Win32 DLL


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多