• <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>

            統(tǒng)計(jì)

            • 隨筆 - 50
            • 文章 - 42
            • 評(píng)論 - 147
            • 引用 - 0

            留言簿(6)

            隨筆分類(lèi)

            文章分類(lèi)

            Link

            搜索

            •  

            積分與排名

            • 積分 - 165518
            • 排名 - 159

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            在 console mode 中使用 C/C++ 編譯器
          1. CL.exe
            1. cl /c [filename]   /c為只編譯不鏈接的意思,默認(rèn)cl.exe工具會(huì)在編譯之后自動(dòng)調(diào)用LINK.EXE進(jìn)行鏈接
            2. cl.exe運(yùn)行需要指定include、lib等環(huán)境變量
            3. [filename]需要指定文件全名(包含后綴名)
            4. C/C++的編譯是針對(duì)文件進(jìn)行的
          2. lib.exe Microsoft庫(kù)管理工具
            用于打包編譯后的庫(kù)文件(obj),使生成一個(gè)庫(kù)文件(lib)

            obj文件和lib文件一樣,可以直接用于link.exe鏈接工具中,生成exe可執(zhí)行文件。lib.exe的作用只是打包,將多個(gè)obj打包為一個(gè)
          3. link.exe 鏈接工具
            link [file(s)]  /dll選項(xiàng)用來(lái)生成一個(gè)動(dòng)態(tài)鏈接庫(kù)(dll)
          4. 庫(kù)文件的編寫(xiě):
            庫(kù)文件中只包含需要的函數(shù)及數(shù)據(jù)即可,不需要main函數(shù),也不能有main函數(shù)
            庫(kù)文件的調(diào)用者,需要用extern關(guān)鍵字申明要調(diào)用的外部函數(shù)
          5. 目前以lib后綴的庫(kù)有兩種,一種為靜態(tài)鏈接庫(kù)(Static   Libary,以下簡(jiǎn)稱(chēng)“靜態(tài)庫(kù)”),另一種為動(dòng)態(tài)連接庫(kù)(DLL,以下簡(jiǎn)稱(chēng)“動(dòng)態(tài)庫(kù)”)的導(dǎo)入庫(kù)(Import   Libary,以下簡(jiǎn)稱(chēng)“導(dǎo)入庫(kù)”)。  
                靜態(tài)庫(kù)是一個(gè)或者多個(gè)obj文件的打包,所以有人干脆把從obj文件生成lib的過(guò)程稱(chēng)為Archive,即合并到一起。比如你鏈接一個(gè)靜態(tài)庫(kù),如果其中有錯(cuò),它會(huì)準(zhǔn)確的找到是哪個(gè)obj有錯(cuò),即靜態(tài)lib只是殼子。 
                動(dòng)態(tài)庫(kù)一般會(huì)有對(duì)應(yīng)的導(dǎo)入庫(kù),方便程序靜態(tài)載入動(dòng)態(tài)鏈接庫(kù),否則你可能就需要自己LoadLibary調(diào)入DLL文件,然后再手工GetProcAddress獲得對(duì)應(yīng)函數(shù)了。有了導(dǎo)入庫(kù),你只需要鏈接導(dǎo)入庫(kù)后按照頭文件函數(shù)接口的聲明調(diào)用函數(shù)就可以了。
                導(dǎo)入庫(kù)和靜態(tài)庫(kù)的區(qū)別很大,他們實(shí)質(zhì)是不一樣的東西。靜態(tài)庫(kù)本身就包含了實(shí)際執(zhí)行代碼、符號(hào)表等等,而對(duì)于導(dǎo)入庫(kù)而言,其實(shí)際的執(zhí)行代碼位于動(dòng)態(tài)庫(kù)中,導(dǎo)入庫(kù)只包含了地址符號(hào)表等,確保程序找到對(duì)應(yīng)函數(shù)的一些基本地址信息。
          6. 動(dòng)態(tài)鏈接庫(kù)(dll)
            一般為提高程序可讀性,使用#define DllExport __declspec(dllexport)宏定義Dll中需要導(dǎo)出的函數(shù);在每個(gè)需要導(dǎo)出的函數(shù)前使用DllExport,例如DllExport int multiple(int x,int y)
            生成一個(gè)Dll的方法:1.使用cl.exe /c [filename]將源文件生成庫(kù)文件 2.使用link.exe /dll [filename.obj]將此obj文件生成dll
            調(diào)用Dll的方法一:1. 使用extern指定外部函數(shù)名 2.在程序中直接使用將要調(diào)用的Dll的函數(shù)名 3.鏈接時(shí)加入上一步驟中生成的庫(kù)文件(.lib)
          7. 方法二:運(yùn)行時(shí)動(dòng)態(tài)加載
            C代碼示例:
            //lib.c
            #define DllExport __declspec(dllexport)
            DllExport int multiple(int x,int y)
            {
             return x*y;
            }
            //libCaller.c
            #include "windows.h"
            //extern  int multiple(int x,int y);
            typedef UINT (CALLBACK* LPFNDLLFUNC1)(int,int);
            HINSTANCE hf;
            LPFNDLLFUNC1 func;
            main()
            {
                 
            hf= LoadLibrary("lib.dll");
                 if(hf!=0)
                 {
                      func = (LPFNDLLFUNC1)GetProcAddress(hf,"multiple");
                      printf("Multiple:%d\r\n",func(5,12));
                      FreeLibrary(hf);
                }
            }
          8. Windows中的.lib文件分兩種類(lèi)型
            1.靜態(tài)庫(kù)文件,用于編譯時(shí)供其他對(duì)象引用 2.動(dòng)態(tài)鏈接庫(kù)的導(dǎo)出文件。鏈接時(shí)使用,無(wú)需使用LoadLibrary動(dòng)態(tài)加載。
          9. Link.exe工具在使用.def文件生成DLL時(shí)的兩種命令行語(yǔ)句:
            1. 如果DEF文件中沒(méi)有LIBRARY語(yǔ)句,需要同時(shí)指定/DEF /DLL選項(xiàng)
            2. 如果DEF文件中有LIBRARY語(yǔ)句,只需指定/DEF選項(xiàng)即可生成DLL
          10. Microsoft Visult Studio開(kāi)發(fā)工具中CL.exe工具CL的意思及Compile和Link
          11. 生成DLL的方式(listed in recommended order of use):
            1. 在源文件中使用VC++自定義關(guān)鍵字__declspec(dllexport)
            2. 使用包含EXPORTS語(yǔ)句的.def文件
            3. 使用Link.exe工具的/EXPORT選項(xiàng)(定義導(dǎo)出函數(shù))
          12. //DEF源文件Sample
            EXPORTS
            add
          13. //DLL源文件Sample
            int add(int x,int y)
            {
             return x + y;
            }
          14. int substract(int x,int y)
            {
             return x-y;
            }
          15.  

             

             

            我總是鼓勵(lì) C/C++ 的學(xué)習(xí)者,在剛接觸這個(gè)程式語(yǔ)言的時(shí)候,先以 console mode(DOS-like)程式為目標(biāo)。換言之,不要一開(kāi)始就想寫(xiě) GUI 程式、想開(kāi)視窗、想有眩目亮麗的畫(huà)面 -- 那只是未走先飛,揠苗助長(zhǎng)罷了。
            所謂 console 程式,就是文字模式的程式,我們可以在其中好好把 C/C++ 的語(yǔ)言根基練好,而不會(huì)分心於其他暫無(wú)必要的 GUI 枝節(jié)上。
            我一直以為,這是理所當(dāng)然的事情,卻也一直發(fā)現(xiàn),有不少大專(zhuān)院校的大一 C/C++ 課程,同學(xué)們必須寫(xiě)個(gè)小作家、小畫(huà)家、小算盤(pán)┅做為期中或期末作業(yè)。
            果然世界不能大同,各人看法殊異 :)
            我不但認(rèn)為 C/C++ 程式開(kāi)發(fā)對(duì)象初期要以 console mode 為主,我也認(rèn)為,C/C++ 的程式開(kāi)發(fā)環(huán)境,初期也要以 console mode 為主。換言之,不要一開(kāi)始就進(jìn)入整合環(huán)境(IDE)。整合環(huán)境中那麼多視窗、那麼多功能、那麼多預(yù)設(shè)值,會(huì)讓程式新手眼花撩亂,無(wú)法掌握程式編譯過(guò)程中一些有價(jià)值的知識(shí)與經(jīng)驗(yàn)。
            等我們對(duì)編譯程序有了起碼的了解,再來(lái)使用整合環(huán)境,我認(rèn)為這才最好。
            所以不論在 <深入淺出 MFC> 或 <多型與虛擬> 書(shū)籍中,我都會(huì)簡(jiǎn)述console mode 下的作業(yè)方式。<深入淺出 MFC> 在 p.224 列出,<多型與虛擬> 在 p.233 列出。
            但仍然偶而會(huì)收到網(wǎng)友(不論是否上兩本書(shū)的讀者)的詢(xún)問(wèn),詢(xún)問(wèn)console mode 的編譯方式,或詢(xún)問(wèn)他們所遭遇的問(wèn)題。
            我再次整理這個(gè)題目。再有類(lèi)似問(wèn)題,我就可以整篇 mail 給發(fā)問(wèn)者了。
            ★★ 注意:以下適合 PC 環(huán)境 ★★
            ●C/C++ 編譯器需要的環(huán)境變數(shù)設(shè)定
            古早以來(lái),PC 上的 C 編譯器,就需要兩個(gè)環(huán)境變數(shù):
            LIB:這個(gè)環(huán)境變數(shù)告訴編譯器說(shuō),必要的 libraries 在哪里(哪個(gè)磁碟目錄下)
            INCLUDE:告訴編譯器說(shuō),必要的 header files 在哪里(哪個(gè)磁碟目錄下)
            另外,為了讓我們能夠在任何 working directory 都叫得到編譯器,當(dāng)然我們必須設(shè)定 PATH。
            從古早以來(lái),一直到現(xiàn)在,C/C++ 編譯器都需要這三個(gè)環(huán)境變數(shù)。
            ●以 Visual C++ 為例
            以 Visual C++ 為例,如果安裝後的檔案布局如下:
            C:\MSDEV\VC98\BIN : 這里放有編譯器 CL.EXE
            C:\MSDEV\VC98\INCLUDE : 這里放有 C/C++ header files
            C:\MSDEV\VC98\LIB : 這里放有 C/C++ standard libraries
            那麼你可以寫(xiě)一個(gè)批次檔如下:
            set PATH=C:\MSDEV\VC98\BIN;C:\MSDEV\COMMON\MSDEV98\BIN
            set INCLUDE=C:\MSDEV\VC98\INCLUDE
            set LIB=C:\MSDEV\VC98\LIB

            之所以需要另外設(shè)定 PATH=C:\MSDEV\COMMON\MSDEV98\BIN,是因?yàn)榫幾g器 CL.EXE 執(zhí)行時(shí)需要 MSPDB60.DLL,而它被安裝於 C:\MSDEV\COMMON\MSDEV98\BIN 之中。
            如果你寫(xiě)的程式不只是單純的 C/C++ 程式,還用到了 MFC,一樣可以在 console mode 下編譯,這時(shí)候你的環(huán)境變數(shù)應(yīng)該如此設(shè)定:
            set PATH=C:\MSDEV\VC98\BIN;C:\MSDEV\COMMON\MSDEV98\BIN
            set INCLUDE=C:\MSDEV\VC98\INCLUDE;C:\MSDEV\VC98\MFC\INCLUDE
            set LIB=C:\MSDEV\VC98\LIB;C:\MSDEV\VC98\MFC\LIB

            多指定了 MFC\INCLUDE 和 MFC\LIB,就可以讓編譯器和聯(lián)結(jié)器找到 MFC 的 header files 和 libraries。如果你還需要用到 ATL,就得在 INCLUDE 環(huán)境變數(shù)中再加上 C:\MSDEV\VC98\ATL\INCLUDE。
            ●以 Borland C++Builder 為例
            以 Borland C++Builder 為例,如果安裝後的檔案布局如下:
            C:\BORLAND\CBuilder3\BIN : 這里放有編譯器 BCC32.EXE
            C:\BORLAND\CBuilder3\INCLUDE : 這里放有 C/C++ header files
            C:\BORLAND\CBuilder3\LIB : 這里放有 C/C++ standard libraries
            那麼你可以寫(xiě)一個(gè)批次檔如下:
            set PATH=C:\BORLAND\CBuilder3\BIN
            set INCLUDE=C:\BORLAND\CBuilder3\INCLUDE
            set LIB=C:\BORLAND\CBuilder3\LIB

            ●如何在 console 中編譯 C/C++ 程式
            首先,開(kāi)啟一個(gè) DOS Box(DOS Prompt, DOS VM),然後在該 DOS box 中執(zhí)行上述寫(xiě)好的批次檔,完成環(huán)境變數(shù)的設(shè)定。你可以再在 DOS 提示號(hào)下鍵入 set 命令,看看環(huán)境變數(shù)的設(shè)定內(nèi)容正確與否。
            然後就可以直接在 DOS 提示號(hào)下鍵入編譯器名稱(chēng),開(kāi)始編譯了。如果你使用 Visual C++,就這麼做:
            C:\> CL test.cpp
            如果你使用 C++Builder,就這麼做:
            C:\> BCC32 test.cpp
            至於特殊情況下需要什麼特殊的 options,就必須自己查一下啦。只要執(zhí)行 CL /? 或 BCC32(其後不加任何引數(shù)),便可看到所有的 compile options。
            ●編譯器與聯(lián)結(jié)器的關(guān)系
            早期的編譯過(guò)程與聯(lián)結(jié)過(guò)程是分開(kāi)的。換句話(huà)說(shuō)我們必須做兩個(gè)動(dòng)作:
            C:\> Cl test.cpp
            C:\> LINK test.obj xxx (xxx 代表各個(gè)必要的 libraries)

            或是:
            C:\> BCC32 test.cpp
            C:\> TLINK32 test.obj xxx (xxx 代表各個(gè)必要的 libraries)

            如今的編譯過(guò)程與聯(lián)結(jié)過(guò)程當(dāng)然還是分開(kāi)的,但是我們的動(dòng)作只需一個(gè):
            C:\> CL test.cpp
            或是:
            C:\> BCC32 test.cpp
            這是因?yàn)榫幾g器變聰明了,除非你指定 /c option(表示只編譯不聯(lián)結(jié)),否則它便自動(dòng)為你呼叫聯(lián)結(jié)器進(jìn)行聯(lián)結(jié)動(dòng)作。過(guò)去以來(lái)頗令 programmer煩惱的「該使用哪些 libraries」的問(wèn)題,編譯器也有了聰明的解決方案:它將程式中用到的 library functions 記錄起來(lái),同時(shí)也錄下它們所屬的library 名稱(chēng),於是聯(lián)結(jié)器就可以從這個(gè)表格中知道要聯(lián)結(jié)哪些 libraries 了。
            ●環(huán)境變數(shù)與 DOS VM(Virtual Machine)的關(guān)系
            你可以同時(shí)開(kāi)起多個(gè) DOS Box,但是你不能夠在某個(gè) DOS Box 中執(zhí)行上述批次檔而在另一個(gè) DOS VM 中享受其環(huán)境設(shè)定。
            這是因?yàn)槊總€(gè) DOS Box 都是一個(gè) Virtual Machine,彼此誰(shuí)也看不到誰(shuí),互不相干。
            除非你在 autoexec.bat 中就設(shè)定好上述那些環(huán)境變數(shù)。這麼一來(lái),任何一個(gè)新開(kāi)啟的 DOS VM 便會(huì)因?yàn)槔^承最原始的 DOS VM 環(huán)境,而繼承了那些變數(shù)設(shè)定。
            ●環(huán)境空間(environment space)不足
            最易造成大家困擾的,就是環(huán)境空間(environment space)不足的問(wèn)題。
            當(dāng)你安裝好 Visual C++,會(huì)在其 BIN 子目錄中發(fā)現(xiàn)一個(gè)名為 VCVARS32.BAT 的檔案。這個(gè)檔案其實(shí)就是做上述的環(huán)境變數(shù)設(shè)定動(dòng)作(這在 Visual C++ 安裝過(guò)程的最後一個(gè)步驟有說(shuō)明。哎,有多少人安裝軟體不看說(shuō)明!)。所以,你可以在任何 DOS Box 中執(zhí)行此檔,取代前述我們自己的批次檔。
            但是通常大家都有失敗的經(jīng)驗(yàn),得到 "Out of environment space" 的錯(cuò)誤訊息。這是因?yàn)?VCVARS32.BAT 使用以下句法:
            set INCLUDE=%MSVCDir%\ATL\INCLUDE;%MSVCDir%\INCLUDE;%MSVCDir%\MFC\INCLUDE;%INCLUDE%
            set LIB=%MSVCDir%\LIB;%MSVCDir%\MFC\LIB;%LIB%

            意思是把 INCLUDE 的原始設(shè)定(%INCLUDE%)再附加其他設(shè)定,并把LIB 的原始設(shè)定(%LIB%)再附加其他設(shè)定。如果原始設(shè)定已經(jīng)很長(zhǎng),多來(lái)這麼幾次,便 "Out of environment space" 啦!
            做法之一是調(diào)高環(huán)境空間的大小。請(qǐng)?jiān)?c:\config.sys 檔中加上這行:
            shell=C:\COMMAND.COM C:\ /E:1024 /P
            其中 /E:1024 便是表示將環(huán)境空間調(diào)為 1024 bytes。(不夠?再調(diào))
            做法之二是不要使用 VCVARS32.BAT 的那種「附加」句型,改用前述我們自己的批次檔。要知道,我們可能有好幾個(gè)編譯器環(huán)境(VC、BCB、G++ ┅),需要輪番測(cè)試我們的程式;如果使用「附加」句型,多來(lái)幾次,再大的環(huán)境空間也會(huì)消磨殆盡。
            方法一和方法二要雙管齊下唷。
            ●有任何規(guī)模上的限制嗎?
            使用 console 模式(或稱(chēng) command line 模式)來(lái)編譯聯(lián)結(jié)程式,程式的大小可否有任何規(guī)模上的限制?答案是沒(méi)有!
            它的缺點(diǎn)是沒(méi)有工具幫你管理檔案、沒(méi)有預(yù)設(shè)值讓你少打幾個(gè)字、沒(méi)有分析工具幫你整理 objects,讓你瀏覽 objects、symbols┅。所以一旦你基本功學(xué)會(huì)了,要開(kāi)始中大型程式的設(shè)計(jì),當(dāng)然以整合環(huán)境(IDE)為佳。
            ●不要誤會(huì)
            我這不是開(kāi)倒車(chē),要大家回到茹毛飲血的時(shí)代,都回頭去做山頂洞人。而是我覺(jué)得,對(duì)於一位 C/C++ 初學(xué)者,整合環(huán)境(IDE)的運(yùn)用恐怕帶來(lái)一頭霧水,不如先在 console mode 下作業(yè)。一方面多認(rèn)識(shí)一些環(huán)境設(shè)定方面的常識(shí),滿(mǎn)好的,一方面比較方便好用,也不必寫(xiě)個(gè) 1000 行的小小練習(xí)還得啟動(dòng) 五五加農(nóng)炮,一方面求知的力量可以全部放在語(yǔ)言的練習(xí)上頭。
            等有了一定的程度,再使用整合環(huán)境,就不會(huì)如墜五里霧了。

            posted on 2009-03-18 00:00 pear_li 閱讀(910) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): C++

            久久综合给久久狠狠97色| 日韩精品久久久久久久电影| 亚洲精品97久久中文字幕无码| 久久九九兔免费精品6| 亚洲精品乱码久久久久66| 久久久久久久久久久久中文字幕| 久久精品亚洲日本波多野结衣| www.久久热| 韩国三级中文字幕hd久久精品| 久久天天躁狠狠躁夜夜2020老熟妇 | 99久久精品费精品国产| 久久久久国色AV免费观看| 日韩精品久久久久久久电影| 亚洲愉拍99热成人精品热久久| 精品久久久久久国产| 久久无码精品一区二区三区| 国产美女亚洲精品久久久综合| 狠狠干狠狠久久| 久久人人添人人爽添人人片牛牛| 久久精品蜜芽亚洲国产AV| 欧美麻豆久久久久久中文| 丰满少妇高潮惨叫久久久| 久久久久无码国产精品不卡| 99久久精品免费看国产一区二区三区 | 99re久久精品国产首页2020| 欧美激情精品久久久久久久| 久久国产精品一区二区| 久久综合亚洲色HEZYO社区| 亚洲成色999久久网站| 色欲久久久天天天综合网精品| 国产精品一区二区久久精品无码| 99久久精品国产一区二区| 久久精品无码一区二区app| 狠狠色婷婷久久一区二区三区| 99久久国产宗和精品1上映| 久久久久99精品成人片三人毛片| 久久99精品久久久久久hb无码| 亚洲AV无一区二区三区久久| 91麻豆国产精品91久久久| 亚洲精品久久久www| 日日狠狠久久偷偷色综合0|