• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 9,comments - 14,trackbacks - 0
            大家可能一直在用VC開發(fā)軟件,但是對于這個(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)重的級別;Warnings?as?errors將警告信息當(dāng)作錯(cuò)誤處理;Optimizations是代碼優(yōu)化,可以在Category的Optimizations項(xiàng)中進(jìn)行更細(xì)的設(shè)置;Generate?browse?info用以生成.sbr文件,記錄類、變量等符號信息,可以在Category的Listing?Files項(xiàng)中進(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)試時(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)行對象類型檢查;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í)對函數(shù)名進(jìn)行的命名修飾(可以通過Listing?Files看到各種命名修飾方式)。Struct?member?alignment用以指定數(shù)據(jù)結(jié)構(gòu)中的成員變量在內(nèi)存中是按幾字節(jié)對齊的,根據(jù)計(jì)算機(jī)數(shù)據(jù)總線的位數(shù),不同的對齊方式存取數(shù)據(jù)的速度不一樣。這個(gè)參數(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é)省空間),使用這個(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文件,使編譯器只對最新類定義改動(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,可以指定額外的包含目錄,一般是相對于本項(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è)置。可以設(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:這里可以指定要連接的庫文件,放棄連接的庫文件。還可以增加額外的庫文件目錄,一般是相對于本項(xiàng)目的目錄,如..\Lib。Force?Symbol?References,可以指定連接特定符號定義的庫。

              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):控制臺程序采用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文件的開始部分放上版本號。


              值得注意的是,上面各個(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對編譯通過的COM文件自動(dòng)注冊,可以如下設(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對類成員的智能提示功能很有用,但有時(shí)候會(huì)失靈。你可以先關(guān)掉項(xiàng)目,將.clw和.ncb刪掉,然后重新打開項(xiàng)目,點(diǎn)擊菜單項(xiàng)View->ClassWizard,在彈出的對話框中按一下“Add?All”按鈕;重新Rebuild?All。應(yīng)該可以解決問題。
            posted on 2006-04-19 05:09 陣雨 閱讀(551) 評論(0)  編輯 收藏 引用
            国产69精品久久久久观看软件 | 亚洲国产天堂久久综合| 一级做a爱片久久毛片| 国产精品狼人久久久久影院| 色偷偷91久久综合噜噜噜噜| 伊人久久大香线蕉av一区| 久久久久中文字幕| 亚洲日韩欧美一区久久久久我 | 国产精品福利一区二区久久| 久久强奷乱码老熟女| 99精品久久精品一区二区| 亚洲国产精品久久| 亚洲熟妇无码另类久久久| 久久久黄片| 久久夜色tv网站| 国色天香久久久久久久小说| 精品免费久久久久国产一区| 久久亚洲精品成人AV| 午夜精品久久久久成人| 亚洲国产成人久久精品动漫| 无码人妻精品一区二区三区久久久 | 国产国产成人精品久久| 久久丫忘忧草产品| 久久青青草原亚洲av无码| 成人资源影音先锋久久资源网| 久久经典免费视频| 伊人久久精品影院| 久久人人爽人人爽AV片| 青草影院天堂男人久久| 久久精品中文闷骚内射| 亚洲AV日韩精品久久久久| 伊色综合久久之综合久久| 久久一区二区三区99| 久久精品亚洲乱码伦伦中文 | 免费观看成人久久网免费观看| 精品久久久久久无码专区| 久久亚洲精品成人av无码网站 | 99久久精品免费| 久久青青草原综合伊人| 91麻豆精品国产91久久久久久 | 日本精品久久久久中文字幕8|