日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

VS2013生成、使用dll,lib文件

 Levy_X 2020-06-07

VS2013生成DLL文件

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

  一般來說項目偏愛生成dll動態(tài)庫文件,因為可以解決靜態(tài)庫造成的空間浪費和更新困難問題,另外創(chuàng)建靜態(tài)庫時,我一般是建立空項目后,在項目配置類型中進行選擇。

什么是庫

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

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

靜態(tài)庫

  之所以稱為【靜態(tài)庫】,是因為在鏈接階段,會將匯編生成的目標文件.o與引用到的庫一起鏈接打包到可執(zhí)行文件中。因此對應(yīng)的鏈接方式稱為靜態(tài)鏈接。

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

靜態(tài)庫優(yōu)缺點總結(jié):

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

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

  3. 浪費空間和資源,因為所有相關(guān)的目標文件與牽涉到的函數(shù)庫被鏈接合成一個可執(zhí)行文件。

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

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

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

 ?。?)創(chuàng)建項目時進行設(shè)置

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

 ?。?)生成項目時進行設(shè)置

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

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

拷貝到工程目錄下

  右擊項目 - 在文件資源管理器中打開文件夾 - 將文件拷貝至工程目錄下

使用靜態(tài)庫

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

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

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

動態(tài)庫

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

為什么還需要動態(tài)庫(靜態(tài)庫的缺點)?

  為什么需要動態(tài)庫,其實也是靜態(tài)庫的特點導(dǎo)致。

  1.空間浪費是靜態(tài)庫的一個問題。

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

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

 

  動態(tài)庫特點總結(jié)

  1.動態(tài)庫把對一些庫函數(shù)的鏈接載入推遲到程序運行的時期。

  2.可以實現(xiàn)進程之間的資源共享。(因此動態(tài)庫也稱為共享庫)

  3.將一些程序升級變得簡單。

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

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

創(chuàng)建動態(tài)庫(.dll)

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

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

  創(chuàng)建前設(shè)置步驟如下:單擊“新建項目”,選擇“Win32 項目”,選擇“下一步”,然后到了如下界面:點擊“DLL”,并同時點擊“導(dǎo)出符號”。然后點擊“完成”。“導(dǎo)出符號”,將為我們創(chuàng)建生成DLL的模板。仔細觀察,vs自動為我們創(chuàng)建了示例,導(dǎo)出變量nMakeDLL,導(dǎo)出函數(shù)fnMakeDLL和導(dǎo)出類CMakeDLL。如果上面沒有點擊“導(dǎo)出符號”,將不會生成這些。所以為了方便DLL的創(chuàng)建,我們最好還是使用“導(dǎ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,然后我們再定義MAKEDLL_API為__declspec(dllexport),否則我們定義__declspec(dllimport)。前者主要為生成DLL的項目所使用,后者為使用DLL的項目所使用。dllexportdllimport存儲類特性是C和C 語言的Microsoft專用擴展。可以使用它們從 DLL 中導(dǎo)出或向其中導(dǎo)入函數(shù)、數(shù)據(jù)和對象。

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

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

  修改完成后點擊Build項目,在輸出欄顯示dll文件的生成位置。

  (2)生成項目時設(shè)置

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

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

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

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

 

  StaticLibrary.lib的大小為190KB,DynamicLibrary.lib的大小為3KB,靜態(tài)庫對應(yīng)的lib文件叫靜態(tài)庫,動態(tài)庫對應(yīng)的lib文件叫導(dǎo)入庫。實際上靜態(tài)庫本身就包含了實際執(zhí)行代碼、符號表等等,而對于導(dǎo)入庫而言,其實際的執(zhí)行代碼位于動態(tài)庫中,導(dǎo)入庫只包含了地址符號表等,確保程序找到對應(yīng)函數(shù)的一些基本地址信息。

使用動態(tài)庫

  在引用一個新的dll時,我們一般需要dll的.h,.lib和.dll三個文件。

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

使用方法總結(jié)

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

.h有兩種:

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

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

.lib的方法有兩種

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

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

dll的方法有兩種

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

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

  以上皆可以自由組合。 

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

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

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

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多