lib 和 dll 的區(qū)別很澄、生成以及使用詳解

轉(zhuǎn)載:http://www.cnblogs.com/TenosDoIt/p/3203137.html

首先介紹一下靜態(tài)庫(靜態(tài)鏈接庫)乳讥、動(dòng)態(tài)庫(動(dòng)態(tài)鏈接庫)的概念聪舒,首先兩者都是代碼共享的方式昆雀。

靜態(tài)庫:在鏈接步驟中辱志,連接器將從庫文件取得所需的代碼蝠筑,復(fù)制到生成的可執(zhí)行文件中,這種庫稱為靜態(tài)庫揩懒,其特點(diǎn)是可執(zhí)行文件中包含了庫代碼的一份完整拷貝什乙;缺點(diǎn)就是被多次使用就會(huì)有多份冗余拷貝。即靜態(tài)庫中的指令都全部被直接包含在最終生成的 EXE 文件中了旭从。在vs中新建生成靜態(tài)庫的工程稳强,編譯生成成功后,只產(chǎn)生一個(gè).lib文件

動(dòng)態(tài)庫:動(dòng)態(tài)鏈接庫是一個(gè)包含可由多個(gè)程序同時(shí)使用的代碼和數(shù)據(jù)的庫和悦,DLL不是可執(zhí)行文件退疫。動(dòng)態(tài)鏈接提供了一種方法,使進(jìn)程可以調(diào)用不屬于其可執(zhí)行代碼的函數(shù)鸽素。函數(shù)的可執(zhí)行代碼位于一個(gè) DLL 中褒繁,該 DLL 包含一個(gè)或多個(gè)已被編譯、鏈接并與使用它們的進(jìn)程分開存儲(chǔ)的函數(shù)馍忽。在vs中新建生成動(dòng)態(tài)庫的工程棒坏,編譯成功后,產(chǎn)生一個(gè).lib文件和一個(gè).dll文件

那么上述靜態(tài)庫和動(dòng)態(tài)庫中的lib有什么區(qū)別呢遭笋?

靜態(tài)庫中的lib:該LIB包含函數(shù)代碼本身(即包括函數(shù)的索引坝冕,也包括實(shí)現(xiàn)),在編譯時(shí)直接將代碼加入程序當(dāng)中

動(dòng)態(tài)庫中的lib:該LIB包含了函數(shù)所在的DLL文件和文件中函數(shù)位置的信息(索引)瓦呼,函數(shù)實(shí)現(xiàn)代碼由運(yùn)行時(shí)加載在進(jìn)程空間中的DLL提供

總之喂窟,lib是編譯時(shí)用到的,dll是運(yùn)行時(shí)用到的央串。如果要完成源代碼的編譯磨澡,只需要lib;如果要使動(dòng)態(tài)鏈接的程序運(yùn)行起來质和,只需要dll稳摄。

以下例子均在vs2010上測試

生成和使用動(dòng)態(tài)庫

生成動(dòng)態(tài)庫

新建項(xiàng)目--win32項(xiàng)目--填寫項(xiàng)目名--確定--下一步--應(yīng)用程序類型:選擇dll--附加選項(xiàng):選擇導(dǎo)出符號(hào)--完成

可以看到生成了一個(gè)dllmain.cpp 文件,這是dll應(yīng)用程序的入口饲宿,注意它和普通工程的入口main函數(shù)不同厦酬,這個(gè)文件我們不需要修改。

在這個(gè)動(dòng)態(tài)庫中我們舉例導(dǎo)出一個(gè)變量瘫想,一個(gè)類弃锐,一個(gè)函數(shù),頭文件dll.h如下:

1//新建生成dll的工程時(shí)殿托,vs默認(rèn)定義了宏DLL_EXPORT,因此霹菊,DLL_API 是 __declspec(dllexport),用來導(dǎo)出2//當(dāng)我們?cè)陟o態(tài)調(diào)用dll時(shí),我們包含該頭文件旋廷,由于沒有定義DLL_EXPORT谆棺,所以DLL_API是3//__declspec(dllimport),用來導(dǎo)入4#ifdef DLL_EXPORTS5#defineDLL_API __declspec(dllexport)6#else7#defineDLL_API __declspec(dllimport)8#endif910//導(dǎo)出類11classDLL_API Cdll {12public:13Cdll(void);14//TODO: 在此添加您的方法舍哄。15};1617//導(dǎo)出變量葫掉,變量在.cpp文件中定義18externDLL_APIintndll;1920//導(dǎo)出函數(shù)拓哺,加extern "C",是為了保證編譯時(shí)生成的函數(shù)名不變,這樣動(dòng)態(tài)調(diào)用dll時(shí)才能21//正確獲取函數(shù)的地址22extern"C"DLL_APIintfndll(void);

dll.cpp 文件如下:

1#include"dll.h"234//這是導(dǎo)出變量的一個(gè)示例5DLL_APIintndll=6;67//這是導(dǎo)出函數(shù)的一個(gè)示例扎运。8DLL_APIintfndll(void)9{10return42;11}1213//這是已導(dǎo)出類的構(gòu)造函數(shù)瑟曲。14//有關(guān)類定義的信息,請(qǐng)參閱 dll.h15Cdll::Cdll()16{17return;18}

調(diào)用動(dòng)態(tài)庫

有兩種方法調(diào)用動(dòng)態(tài)庫豪治,一種隱式鏈接洞拨,一種顯示鏈接。

調(diào)用動(dòng)態(tài)庫:隱式鏈接

隱式鏈接 需要.h文件负拟,dll文件烦衣,lib文件

(1)將dll放到工程的工作目錄

(2)設(shè)置項(xiàng)目屬性--vc++目錄--庫目錄為lib所在的路徑

(3)將lib添加到項(xiàng)目屬性--鏈接器--輸入--附加依賴項(xiàng)(或者直接在源代碼中加入#pragma comment(lib, “**.lib”))

(4)在源文件中添加.h頭文件

然后就像平常一樣調(diào)用普通函數(shù)、類掩浙、變量

調(diào)用動(dòng)態(tài)庫:顯示鏈接

顯示鏈接 只需要.dll文件花吟,但是這種調(diào)用方式不能調(diào)用dll中的變量或者類(其實(shí)可以調(diào)用類,但是相當(dāng)麻煩厨姚,有興趣者可參考http://blog.csdn.net/jdcb2001/article/details/1394883

顯示調(diào)用主要使用WIN32 API函數(shù)LoadLibrary衅澈、GetProcAddress,舉例如下:

1typedefint(*dllfun)(void);//定義指向dll中函數(shù)的函數(shù)指針2HINSTANCE hlib = LoadLibrary(".\\dll.dll");3if(!hlib)4{5std::cout<<"load dll error\n";6return-1;7}8dllfun fun = (dllfun)GetProcAddress(hlib,"fndll");9if(!fun)10{11std::cout<<"load fun error\n";12return-1;13}14fun();

生成和使用靜態(tài)庫

生成靜態(tài)庫

新建項(xiàng)目--win32項(xiàng)目--填寫項(xiàng)目名--確定--下一步--應(yīng)用程序類型:選擇靜態(tài)庫

靜態(tài)庫項(xiàng)目沒有main函數(shù)谬墙,也沒有像dll項(xiàng)目中的dllmain今布。

創(chuàng)建項(xiàng)目后添加.h文件,添加相應(yīng)的導(dǎo)出函數(shù)芭梯、變量或類险耀,如下所示

1#ifndef _MYLIB_H_2#define_MYLIB_H_34voidfun(inta);56externintk;78classtestclass9{10public:11testclass();12voidprint();13};1415#endif

.cpp文件如下

1#include"stdafx.h"2#include"lib.h"3#include 45voidfun(inta)6{7std::cout<

編譯工程后就會(huì)生成一個(gè).lib文件

使用靜態(tài)庫

需要.h文件弄喘,lib文件

(1)設(shè)置項(xiàng)目屬性--vc++目錄--庫目錄為lib所在的路徑

(2)將lib添加到項(xiàng)目屬性--鏈接器--輸入--附加依賴項(xiàng)(或者直接在源代碼中加入#pragma comment(lib, “**.lib”))

(3)在源文件中添加.h頭文件

然后就像平常一樣調(diào)用普通函數(shù)玖喘、類、變量蘑志,舉例如下:

1#include 2#include"lib.h"34#pragmacomment(lib, "lib.lib")56intmain()7{8fun(4);9std::cout<

【版權(quán)聲明】轉(zhuǎn)載請(qǐng)注明出處http://www.cnblogs.com/TenosDoIt/p/3203137.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末累奈,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子急但,更是在濱河造成了極大的恐慌澎媒,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件波桩,死亡現(xiàn)場離奇詭異戒努,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)镐躲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門储玫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來侍筛,“玉大人,你說我怎么就攤上這事撒穷∠灰” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵端礼,是天一觀的道長禽笑。 經(jīng)常有香客問我,道長蛤奥,這世上最難降的妖魔是什么佳镜? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮喻括,結(jié)果婚禮上邀杏,老公的妹妹穿的比我還像新娘。我一直安慰自己唬血,他們只是感情好望蜡,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拷恨,像睡著了一般脖律。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上腕侄,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天小泉,我揣著相機(jī)與錄音,去河邊找鬼冕杠。 笑死微姊,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的分预。 我是一名探鬼主播兢交,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼笼痹!你這毒婦竟也來了配喳?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤凳干,失蹤者是張志新(化名)和其女友劉穎晴裹,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體救赐,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡涧团,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泌绣。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡喳瓣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出赞别,到底是詐尸還是另有隱情畏陕,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布仿滔,位于F島的核電站惠毁,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏崎页。R本人自食惡果不足惜鞠绰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望飒焦。 院中可真熱鬧蜈膨,春花似錦、人聲如沸牺荠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽休雌。三九已至灶壶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間杈曲,已是汗流浹背驰凛。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留担扑,地道東北人恰响。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像涌献,于是被迫代替她去往敵國和親胚宦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容