Lib和DLL的區(qū)別
以下大部分內(nèi)容摘自:http://blog.csdn.net/jhgameboy/article/details/23710429
**
關(guān)于lib和dll的區(qū)別如下:
**
(1)lib是編譯時用到的,dll是運(yùn)行時用到的。如果要完成源代碼的編譯,只需要lib;如果要使動態(tài)鏈接的程序運(yùn)行起來,只需要dll。
(2)如果有dll文件,那么lib一般是一些索引信息,記錄了dll中函數(shù)的入口和位置,dll中是函數(shù)的具體內(nèi)容;如果只有l(wèi)ib文件,那么這個lib文件是靜態(tài)編譯出來的,索引和實(shí)現(xiàn)都在其中。使用靜態(tài)編譯的lib文件,在運(yùn)行程序時不需要再掛動態(tài)庫,缺點(diǎn)是導(dǎo)致應(yīng)用程序比較大,而且失去了動態(tài)庫的靈活性,發(fā)布新版本時要發(fā)布新的應(yīng)用程序才行。
(3)動態(tài)鏈接的情況下,有兩個文件:一個是LIB文件,一個是DLL文件。LIB包含被DLL導(dǎo)出的函數(shù)名稱和位置,DLL包含實(shí)際的函數(shù)和數(shù)據(jù),應(yīng)用程序使用LIB文件鏈接到DLL文件。在應(yīng)用程序的可執(zhí)行文件中,存放的不是被調(diào)用的函數(shù)代碼,而是DLL中相應(yīng)函數(shù)代碼的地址,從而節(jié)省了內(nèi)存資源。DLL和LIB文件必須隨應(yīng)用程序一起發(fā)行,否則應(yīng)用程序會產(chǎn)生錯誤。如果不想用lib文件或者沒有l(wèi)ib文件,可以用WIN32 API函數(shù)LoadLibrary、GetProcAddress裝載。
使用lib需注意兩個文件:
(1).h頭文件,包含lib中說明輸出的類或符號原型或數(shù)據(jù)結(jié)構(gòu)。應(yīng)用程序調(diào)用lib時,需要將該文件包含入應(yīng)用程序的源文件中。
(2).LIB文件,略。
使用dll需注意三個文件:
(1).h頭文件,包含dll中說明輸出的類或符號原型或數(shù)據(jù)結(jié)構(gòu)的.h文件。應(yīng)用程序調(diào)用dll時,需要將該文件包含入應(yīng)用程序的源文件中。
(2).LIB文件,是dll在編譯、鏈接成功之后生成的文件,作用是當(dāng)其他應(yīng)用程序調(diào)用dll時,需要將該文件引入應(yīng)用程序,否則產(chǎn)生錯誤。
(3).dll文件,真正的可執(zhí)行文件,開發(fā)成功后的應(yīng)用程序在發(fā)布時,只需要有.exe文件和.dll文件,并不需要.lib文件和.h頭文件。
使用lib的方法:
靜態(tài)lib中,一個lib文件實(shí)際上是任意個obj文件的集合,obj文件是cpp文件編譯生成的。在編譯這種靜態(tài)庫工程時,根本不會遇到鏈接錯誤;即使有錯,也只會在使用這個lib的EXT文件或者DLL工程里暴露出來。
在VC中新建一個static library類型的工程Lib,加入test.cpp文件和test.h文件(頭文件內(nèi)包括函數(shù)聲明),然后編譯,就生成了Lib.lib文件。
別的工程要使用這個lib有兩種方式:
(1)在project->link->Object/Library Module中加入Lib.lib文件(先查詢工程目錄,再查詢系統(tǒng)Lib目錄);或者在源代碼中加入指令#pragma comment(lib, “Lib.lib”)。
(2)將Lib.lib拷入工程所在目錄,或者執(zhí)行文件生成的目錄,或者系統(tǒng)Lib目錄中。
(3)加入相應(yīng)的頭文件test.h。
使用DLL的方法:
使用動態(tài)鏈接中的lib,不是obj文件的集合,即里面不會有實(shí)際的實(shí)現(xiàn),它只是提供動態(tài)鏈接到DLL所需要的信息,這種lib可以在編譯一個DLL工程時由編譯器生成。
(一).靜態(tài)調(diào)用其步驟如下:
1.把你的youApp.DLL拷到你目標(biāo)工程(需調(diào)用youApp.DLL的工程)的Debug目錄下;
2.把你的youApp.lib拷到你目標(biāo)工程(需調(diào)用youApp.DLL的工程)目錄下;
3.把你的youApp.h(包含輸出函數(shù)的定義)拷到你目標(biāo)工程(需調(diào)用youApp.DLL的工程)目
錄下;
4.打開你的目標(biāo)工程選中工程,選擇Visual C++的Project主菜單的Settings菜單;
5.執(zhí)行第4步后,VC將會彈出一個對話框,在對話框的多頁顯示控件中選擇Link頁。然
后在Object/library modules輸入框中輸入:youApp.lib
6.選擇你的目標(biāo)工程Head Files加入:youApp.h文件;
7.最后在你目標(biāo)工程(*.cpp,需要調(diào)用DLL中的函數(shù))中包含你的:#include “youApp.h ”
注:youApp是你DLL的工程名。
具體代碼自己嘗試,只有自己做過一遍才會記得更清楚~!
(二).動態(tài)調(diào)用:
動態(tài)調(diào)用時只需做靜態(tài)調(diào)用.
{
HINSTANCE hDllInst = LoadLibrary( “youApp.DLL “);
if(hDllInst)
{
typedef DWORD (WINAPI *MYFUNC)(DWORD,DWORD);
MYFUNC youFuntionNameAlias = NULL; // youFuntionNameAlias 函數(shù)別名
youFuntionNameAlias = (MYFUNC)GetProcAddress
(hDllInst, “youFuntionName “);
// youFuntionName 在DLL中聲明的函數(shù)名
if(youFuntionNameAlias)
{
youFuntionNameAlias(param1,param2);
}
FreeLibrary(hDllInst);
}
}
新加的:
DLL的使用方法有兩種,目前只討論一種方法。
利用__declspec(dllexport)來定義DLL出口,使用DLL的使用
新建工程:
.H文件:
- #ifndef _TESTDLL_H_
- #define _TESTDLL_H_
- #define NIPARTICLE_ENTRY __declspec(dllexport)
- class NIPARTICLE_ENTRY AddTest
- {
- public:
- AddTest();
- ~AddTest();
- int GetAddInfo();
- void SetAddInfo(int _a, int _b);
- private:
- int a;
- int b;
- };
- #endif
- #ifndef _TESTDLL_H_
- #define _TESTDLL_H_
- #define NIPARTICLE_ENTRY __declspec(dllexport)
- class NIPARTICLE_ENTRY AddTest
- {
- public:
- AddTest();
- ~AddTest();
- int GetAddInfo();
- void SetAddInfo(int _a, int _b);
- private:
- int a;
- int b;
- };
- #endif
.CPP文件
- #include "TestDll.h"
- AddTest::AddTest()
- {
- a = 0;
- b = 0;
- }
- AddTest::~AddTest()
- {
- }
- int AddTest::GetAddInfo()
- {
- return a + b;
- }
- void AddTest::SetAddInfo(int _a, int _b)
- {
- a = _a;
- b = _b;
- }
- #include "TestDll.h"
- AddTest::AddTest()
- {
- a = 0;
- b = 0;
- }
- AddTest::~AddTest()
- {
- }
- int AddTest::GetAddInfo()
- {
- return a + b;
- }
- void AddTest::SetAddInfo(int _a, int _b)
- {
- a = _a;
- b = _b;
- }
在配置屬性->常規(guī)->配置類型設(shè)置為動態(tài)庫(.dll)
再新建一個工程
.CPP文件
- #include "TestDll.h"
- #include <windows.h>
- #include <iostream>
- //#pragma comment(lib, "Dll.lib")
- using namespace std;
- int main()
- {
- AddTest* pkTest = 0;
- pkTest = new AddTest;
- pkTest->SetAddInfo(5, 6);
- int iOutData = pkTest->GetAddInfo();
- cout << iOutData << endl;
- system("pause");
- return 1;
- }
- #include "TestDll.h"
- #include <windows.h>
- #include <iostream>
- //#pragma comment(lib, "Dll.lib")
- using namespace std;
- int main()
- {
- AddTest* pkTest = 0;
- pkTest = new AddTest;
- pkTest->SetAddInfo(5, 6);
- int iOutData = pkTest->GetAddInfo();
- cout << iOutData << endl;
- system("pause");
- return 1;
- }
編譯通過,就能使用了。
責(zé)任編輯:售電衡衡
-
權(quán)威發(fā)布 | 新能源汽車產(chǎn)業(yè)頂層設(shè)計(jì)落地:鼓勵“光儲充放”,有序推進(jìn)氫燃料供給體系建設(shè)
2020-11-03新能源,汽車,產(chǎn)業(yè),設(shè)計(jì) -
中國自主研制的“人造太陽”重力支撐設(shè)備正式啟運(yùn)
2020-09-14核聚變,ITER,核電 -
探索 | 既耗能又可供能的數(shù)據(jù)中心 打造融合型綜合能源系統(tǒng)
2020-06-16綜合能源服務(wù),新能源消納,能源互聯(lián)網(wǎng)
-
新基建助推 數(shù)據(jù)中心建設(shè)將迎爆發(fā)期
2020-06-16數(shù)據(jù)中心,能源互聯(lián)網(wǎng),電力新基建 -
泛在電力物聯(lián)網(wǎng)建設(shè)下看電網(wǎng)企業(yè)數(shù)據(jù)變現(xiàn)之路
2019-11-12泛在電力物聯(lián)網(wǎng) -
泛在電力物聯(lián)網(wǎng)建設(shè)典型實(shí)踐案例
2019-10-15泛在電力物聯(lián)網(wǎng)案例
-
新基建之充電樁“火”了 想進(jìn)這個行業(yè)要“心里有底”
2020-06-16充電樁,充電基礎(chǔ)設(shè)施,電力新基建 -
燃料電池汽車駛?cè)雽こ0傩占疫€要多久?
-
備戰(zhàn)全面電動化 多部委及央企“定調(diào)”充電樁配套節(jié)奏
-
權(quán)威發(fā)布 | 新能源汽車產(chǎn)業(yè)頂層設(shè)計(jì)落地:鼓勵“光儲充放”,有序推進(jìn)氫燃料供給體系建設(shè)
2020-11-03新能源,汽車,產(chǎn)業(yè),設(shè)計(jì) -
中國自主研制的“人造太陽”重力支撐設(shè)備正式啟運(yùn)
2020-09-14核聚變,ITER,核電 -
能源革命和電改政策紅利將長期助力儲能行業(yè)發(fā)展
-
探索 | 既耗能又可供能的數(shù)據(jù)中心 打造融合型綜合能源系統(tǒng)
2020-06-16綜合能源服務(wù),新能源消納,能源互聯(lián)網(wǎng) -
5G新基建助力智能電網(wǎng)發(fā)展
2020-06-125G,智能電網(wǎng),配電網(wǎng) -
從智能電網(wǎng)到智能城市