乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      VS2013生成、使用dll,lib文件

       Levy_X 2020-06-07

      VS2013生成DLL文件

      vs2013創(chuàng)建及使用DLL

        一般來(lái)說(shuō)項(xiàng)目偏愛(ài)生成dll動(dòng)態(tài)庫(kù)文件,因?yàn)榭梢越鉀Q靜態(tài)庫(kù)造成的空間浪費(fèi)和更新困難問(wèn)題,另外創(chuàng)建靜態(tài)庫(kù)時(shí),我一般是建立空項(xiàng)目后,在項(xiàng)目配置類(lèi)型中進(jìn)行選擇。

      什么是庫(kù)

        庫(kù)是寫(xiě)好的現(xiàn)有的,成熟的,可以復(fù)用的代碼。現(xiàn)實(shí)中每個(gè)程序都要依賴很多基礎(chǔ)的底層庫(kù),不可能每個(gè)人的代碼都從零開(kāi)始,因此庫(kù)的存在意義非同尋常。本質(zhì)上來(lái)說(shuō)庫(kù)是一種可執(zhí)行代碼的二進(jìn)制形式,可以被操作系統(tǒng)載入內(nèi)存執(zhí)行。庫(kù)有兩種:靜態(tài)庫(kù)(.a、.lib)和動(dòng)態(tài)庫(kù)(.so、.dll)。

        所謂靜態(tài)、動(dòng)態(tài)是指鏈接?;仡櫼幌?,將一個(gè)程序編譯成可執(zhí)行程序的步驟:

      靜態(tài)庫(kù)

        之所以稱為【靜態(tài)庫(kù)】,是因?yàn)樵阪溄与A段,會(huì)將匯編生成的目標(biāo)文件.o與引用到的庫(kù)一起鏈接打包到可執(zhí)行文件中。因此對(duì)應(yīng)的鏈接方式稱為靜態(tài)鏈接。

        試想一下,靜態(tài)庫(kù)與匯編生成的目標(biāo)文件一起鏈接為可執(zhí)行文件,那么靜態(tài)庫(kù)必定跟.o文件格式相似。其實(shí)一個(gè)靜態(tài)庫(kù)可以簡(jiǎn)單看成是一組目標(biāo)文件(.o/.obj文件)的集合,即很多目標(biāo)文件經(jīng)過(guò)壓縮打包后形成的一個(gè)文件。

      靜態(tài)庫(kù)優(yōu)缺點(diǎn)總結(jié):

        1. 靜態(tài)庫(kù)對(duì)函數(shù)庫(kù)的鏈接是放在編譯時(shí)期完成的。

        2. 程序在運(yùn)行時(shí)與函數(shù)庫(kù)再無(wú)瓜葛,移植方便。

        3. 浪費(fèi)空間和資源,因?yàn)樗邢嚓P(guān)的目標(biāo)文件與牽涉到的函數(shù)庫(kù)被鏈接合成一個(gè)可執(zhí)行文件。

      Windows下創(chuàng)建與使用靜態(tài)庫(kù)

      創(chuàng)建靜態(tài)庫(kù)(.lib)

        創(chuàng)建靜態(tài)庫(kù)有兩種方法。

       ?。?)創(chuàng)建項(xiàng)目時(shí)進(jìn)行設(shè)置

        創(chuàng)建win32控制臺(tái)程序時(shí),勾選靜態(tài)庫(kù)類(lèi)型(下面的預(yù)編譯等選項(xiàng)可選可不選);打開(kāi)工程“屬性面板”-”配置屬性”-”常規(guī)”,配置類(lèi)型選擇靜態(tài)庫(kù)。

        (2)生成項(xiàng)目時(shí)進(jìn)行設(shè)置

        創(chuàng)建空項(xiàng)目之后,生成項(xiàng)目時(shí),選擇項(xiàng)目-屬性-配置屬性-常規(guī)-項(xiàng)目默認(rèn)值-配置類(lèi)型-選擇生成靜態(tài)庫(kù)lib。

        程序編譯通過(guò)后,Build項(xiàng)目即可生成靜態(tài)庫(kù)。即可生成.lib,輸出欄會(huì)顯示出靜態(tài)庫(kù)的位置。

      拷貝到工程目錄下

        右擊項(xiàng)目 - 在文件資源管理器中打開(kāi)文件夾 - 將文件拷貝至工程目錄下

      使用靜態(tài)庫(kù)

        如果將靜態(tài)鏈接庫(kù)和頭文件拷貝到工程目錄下,則可以只進(jìn)行這一步:“屬性面板”-”配置屬性”-“鏈接器”-”輸入”,附加依賴庫(kù)中輸入靜態(tài)庫(kù)名StaticLibrary.lib,或者采用以下語(yǔ)句:

       1 #pragma comment(lib, './StaticLibrary.lib'); 

        如果沒(méi)有進(jìn)行拷貝,則需要通過(guò)“屬性面板”-”配置屬性”-“VC 目錄”-”庫(kù)目錄”,將路徑添加到工程中,另外在附加依賴庫(kù)目錄中輸入靜態(tài)庫(kù)所在目錄。

      動(dòng)態(tài)庫(kù)

        通過(guò)上面的介紹發(fā)現(xiàn)靜態(tài)庫(kù),容易使用和理解,也達(dá)到了代碼復(fù)用的目的,那為什么還需要?jiǎng)討B(tài)庫(kù)呢?

      為什么還需要?jiǎng)討B(tài)庫(kù)(靜態(tài)庫(kù)的缺點(diǎn))?

        為什么需要?jiǎng)討B(tài)庫(kù),其實(shí)也是靜態(tài)庫(kù)的特點(diǎn)導(dǎo)致。

        1.空間浪費(fèi)是靜態(tài)庫(kù)的一個(gè)問(wèn)題。

        2.另一個(gè)問(wèn)題是靜態(tài)庫(kù)對(duì)程序的更新、部署和發(fā)布也會(huì)帶來(lái)麻煩。如果靜態(tài)庫(kù)lib更新了,所有使用它的應(yīng)用程序都需要重新編譯、發(fā)布給用戶(對(duì)于玩家來(lái)說(shuō),可能是一個(gè)很小的改動(dòng),卻導(dǎo)致整個(gè)程序重新下載,全量更新)。

        動(dòng)態(tài)庫(kù)在程序編譯時(shí)并不會(huì)被連接到目標(biāo)代碼中,而是在程序運(yùn)行時(shí)才被載入。不同的應(yīng)用程序如果調(diào)用相同的庫(kù),那么在內(nèi)存里只需要有一份該共享庫(kù)的實(shí)例,規(guī)避了空間浪費(fèi)問(wèn)題。動(dòng)態(tài)庫(kù)在程序運(yùn)行時(shí)才被載入,也解決了靜態(tài)庫(kù)對(duì)程序的更新、部署和發(fā)布頁(yè)會(huì)帶來(lái)麻煩。用戶只需要更新動(dòng)態(tài)庫(kù)即可,增量更新。

       

        動(dòng)態(tài)庫(kù)特點(diǎn)總結(jié)

        1.動(dòng)態(tài)庫(kù)把對(duì)一些庫(kù)函數(shù)的鏈接載入推遲到程序運(yùn)行的時(shí)期。

        2.可以實(shí)現(xiàn)進(jìn)程之間的資源共享。(因此動(dòng)態(tài)庫(kù)也稱為共享庫(kù))

        3.將一些程序升級(jí)變得簡(jiǎn)單。

        4.甚至可以真正做到鏈接載入完全由程序員在程序代碼中控制(顯示調(diào)用)。

      Windows下創(chuàng)建與使用動(dòng)態(tài)庫(kù)

      創(chuàng)建動(dòng)態(tài)庫(kù)(.dll)

        創(chuàng)建動(dòng)態(tài)庫(kù)同樣有兩種方法,創(chuàng)建前設(shè)置和生成項(xiàng)目時(shí)設(shè)置。

        (1)創(chuàng)建前設(shè)置

        創(chuàng)建前設(shè)置步驟如下:?jiǎn)螕簟靶陆?xiàng)目”,選擇“Win32 項(xiàng)目”,選擇“下一步”,然后到了如下界面:點(diǎn)擊“DLL”,并同時(shí)點(diǎn)擊“導(dǎo)出符號(hào)”。然后點(diǎn)擊“完成”。“導(dǎo)出符號(hào)”,將為我們創(chuàng)建生成DLL的模板。仔細(xì)觀察,vs自動(dòng)為我們創(chuàng)建了示例,導(dǎo)出變量nMakeDLL,導(dǎo)出函數(shù)fnMakeDLL和導(dǎo)出類(lèi)CMakeDLL。如果上面沒(méi)有點(diǎn)擊“導(dǎo)出符號(hào)”,將不會(huì)生成這些。所以為了方便DLL的創(chuàng)建,我們最好還是使用“導(dǎo)出符號(hào)”。

        先看下面這段代碼:

      復(fù)制代碼
      1 #ifdef MAKEDLL_EXPORTS 2 3 #define MAKEDLL_API __declspec(dllexport) 4 5 #else 6 7 #define MAKEDLL_API __declspec(dllimport) 8 9 #endif
      復(fù)制代碼

        如果定義了MAKEDLL_EXPORTS,然后我們?cè)俣xMAKEDLL_API為_(kāi)_declspec(dllexport),否則我們定義__declspec(dllimport)。前者主要為生成DLL的項(xiàng)目所使用,后者為使用DLL的項(xiàng)目所使用。dllexportdllimport存儲(chǔ)類(lèi)特性是C和C 語(yǔ)言的Microsoft專用擴(kuò)展。可以使用它們從 DLL 中導(dǎo)出或向其中導(dǎo)入函數(shù)、數(shù)據(jù)和對(duì)象。

        為什么要使用__declspec(dllexport)與__declspec(dllimport),及兩者的區(qū)別:都是DLL內(nèi)的關(guān)鍵字,即導(dǎo)出與導(dǎo)入。他們是將DLL內(nèi)部的類(lèi)與函數(shù)以及數(shù)據(jù)導(dǎo)出與導(dǎo)入時(shí)使用的。主要區(qū)別在于,dllexport是在這些類(lèi)、函數(shù)以 及數(shù)據(jù)的申明的時(shí)候使用。用過(guò)表明這些東西可以被外部函數(shù)使用,即(dllexport)是把DLL中的相關(guān)代碼(類(lèi),函數(shù),數(shù)據(jù))暴露出來(lái)為其他應(yīng)用程 序使用。使用了(dllexport)關(guān)鍵字,相當(dāng)于聲明了緊接在(dllexport)關(guān)鍵字后面的相關(guān)內(nèi)容是可以為其他程序使用的。而 dllimport關(guān)鍵字是在外部程序需要使用DLL內(nèi)相關(guān)內(nèi)容時(shí)使用的關(guān)鍵字。當(dāng)一個(gè)外部程序要使用DLL內(nèi)部代碼(類(lèi),函數(shù),全局變量)時(shí),只需要在 程序內(nèi)部使用(dllimport)關(guān)鍵字聲明需要使用的代碼就可以了,即(dllimport)關(guān)鍵字是在外部程序需要使用DLL內(nèi)部相關(guān)內(nèi)容的時(shí)候才使用。(dllimport)作用是把DLL中的相關(guān)代碼插入到應(yīng)用程序中。如果沒(méi)有使用dllexport導(dǎo)出函數(shù),將無(wú)法生成lib文件,只能生成dll文件。

        接下來(lái),你可以改寫(xiě)上面的類(lèi)和函數(shù),然后點(diǎn)擊項(xiàng)目,選擇“生成”即可產(chǎn)生DLL和LIB。為了簡(jiǎn)化起見(jiàn),本例只考慮導(dǎo)出函數(shù)。

        修改完成后點(diǎn)擊Build項(xiàng)目,在輸出欄顯示dll文件的生成位置。

        (2)生成項(xiàng)目時(shí)設(shè)置

        這種方法要求生成動(dòng)態(tài)庫(kù)需要設(shè)置工程屬性,打開(kāi)工程“屬性面板”-”配置屬性”-”常規(guī)”,配置類(lèi)型選擇動(dòng)態(tài)庫(kù)。但這種方法是建立空項(xiàng)目,因此,需要在頭文件中手動(dòng)設(shè)置__declspec(dllexport)等語(yǔ)句。

        可以直接使用上面那段代碼,也可以只在導(dǎo)出的函數(shù)前加__declspec(dllexport),注意:前面是兩條下劃線

        生成的DLL文件如下圖所示:

        這里可能大家有個(gè)疑問(wèn),動(dòng)態(tài)庫(kù)怎么還有一個(gè)DynamicLibrary.lib文件?即無(wú)論是靜態(tài)鏈接庫(kù)還是動(dòng)態(tài)鏈接庫(kù),最后都有l(wèi)ib文件,那么兩者區(qū)別是什么呢?其實(shí),兩個(gè)是完全不一樣的東西。

       

        StaticLibrary.lib的大小為190KB,DynamicLibrary.lib的大小為3KB,靜態(tài)庫(kù)對(duì)應(yīng)的lib文件叫靜態(tài)庫(kù),動(dòng)態(tài)庫(kù)對(duì)應(yīng)的lib文件叫導(dǎo)入庫(kù)。實(shí)際上靜態(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ù)的一些基本地址信息。

      使用動(dòng)態(tài)庫(kù)

        在引用一個(gè)新的dll時(shí),我們一般需要dll的.h,.lib和.dll三個(gè)文件。

        將三個(gè)文件拷貝到工程目錄下,對(duì)于lib和頭文件的使用方法與靜態(tài)鏈接庫(kù)相同,這時(shí)直接運(yùn)行程序,可能會(huì)出現(xiàn)一個(gè)錯(cuò)誤,說(shuō)“缺少什么dll”,我們只需將此前生成的dll,放在debug或release目錄下,即可編譯通過(guò)。

      使用方法總結(jié)

        .h,.lib,.dll的添加方法其實(shí)各有很多種。

      .h有兩種:

        1. 頭文件較少時(shí),直接放在工程目錄下,#include '*.h'

        2. 建立include文件夾,放在里面,然后在項(xiàng)目屬性的“VC 目錄”-》“包含目錄”,添加.h路徑即可。

      .lib的方法有兩種

        1.lib文件較少時(shí),直接放在工程目錄下,#pragma comment(lib, 'testCpp.lib')

        2.建立lib文件夾,目屬“VC 目錄”-》“庫(kù)目錄”添加路徑,然后在項(xiàng)目屬性的“鏈接器”-》“輸入”-》“附加依賴項(xiàng)”,添加.lib名字。

      dll的方法有兩種

        1.直接放在debug/release目錄下

        2.建立bin文件夾,放在里面,然后在項(xiàng)目“環(huán)境”中添加bin的路徑(PS:最好不要用這個(gè))

        以上皆可以自由組合。 

      -------------------------------------------------------------------------------------------------

      如果上面的資料對(duì)你有啟發(fā),麻煩點(diǎn)個(gè)推薦,讓更多人的人看到哦。

      關(guān)注公眾號(hào)【兩猿社】,懂點(diǎn)互聯(lián)網(wǎng),懂點(diǎn)IC的程序猿,帶你豐富項(xiàng)目經(jīng)驗(yàn)哦

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(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)論公約

        類(lèi)似文章 更多