c++中.dll与.lib文件的生成与使用的详解
c++中.dll與.lib文件的生成與使用的詳解
--------------------------------------------------------------------------------
兩種庫:
? 包含了函數(shù)所在的DLL文件和文件中函數(shù)位置的信息(入口),代碼由運行時加載在進程空間中的DLL提供,稱為動態(tài)鏈接庫dynamic link library。
? 包含函數(shù)代碼本身,在編譯時直接將代碼加入程序當中,稱為靜態(tài)鏈接庫static link library。
共有兩種鏈接方式:
? 動態(tài)鏈接使用動態(tài)鏈接庫,允許可執(zhí)行模塊(.dll文件或.exe文件)僅包含在運行時定位DLL函數(shù)的可執(zhí)行代碼所需的信息。
? 靜態(tài)鏈接使用靜態(tài)鏈接庫,鏈接器從靜態(tài)鏈接庫LIB獲取所有被引用函數(shù),并將庫同代碼一起放到可執(zhí)行文件中。
--------------------------------------------------------------------------------
兩種文件的區(qū)別
--------------------------------------------------------------------------------
使用lib需注意兩個文件:
?.h頭文件,包含lib中說明輸出的類或符號原型或數(shù)據(jù)結(jié)構(gòu)。應用程序調(diào)用lib時,需要將該文件包含入應用程序的源文件中。
?.LIB文件。
使用dll需注意三個文件:
?.h頭文件,包含dll中說明輸出的類或符號原型或數(shù)據(jù)結(jié)構(gòu)的.h文件。應用程序調(diào)用dll時,需要將該文件包含入應用程序的源文件中。
?.LIB文件,是dll在編譯、鏈接成功之后生成的文件,作用是當其他應用程序調(diào)用dll時,需要將該文件引入應用程序,否則產(chǎn)生錯誤(如果不想用lib文件或者沒有l(wèi)ib文件,可以用WIN32 API函數(shù)LoadLibrary、GetProcAddress裝載)。
?dll文件,真正的可執(zhí)行文件,開發(fā)成功后的應用程序在發(fā)布時,只需要有.exe文件和.dll文件,并不需要.lib文件和.h頭文件。
--------------------------------------------------------------------------------
生成和使用方法
--------------------------------------------------------------------------------
操作系統(tǒng):WIN7
開發(fā)軟件:VS2010
--------------------------------------------------------------------------------
1.生成lib文件
首先,我們先建立一個控制臺工程(新建->工程->控制臺程序),添加add.cpp以及add.h文件。
復制代碼代碼如下:
//sub.h
#ifndef _SUB_H
#define _SUB_H
void sub(int a,int b);
#endif
?
//sub.cpp
#include "sub.h"
#include <iostream>
void sub(int a,int b)
{
??? std::cout<<(a-b)<<std::endl;
}
?
由于在工程中,沒有main()函數(shù),所以直接編譯出錯。這時,要右鍵點擊工程,并選擇工程屬性,出現(xiàn)下圖,選擇靜態(tài)鏈接庫即可。
?
這時候再按F7,build solution即可產(chǎn)生lib文件。在Debug中只生成.lib文件。
2.生成dll文件
生成dll文件的過程與上面的過程是一樣的,只是在選擇Dynamic Library(.dll)即可。在Debug中會生成一個.lib和.dll兩種文件。
--------------------------------------------------------------------------------
3.兩種文件的使用
在使用時,靜態(tài)鏈接庫只要把.h和.lib文件加入到工程文件夾中即可。而動態(tài)鏈接庫要把.h、.lib和.dll文件加入到工程中。
?
復制代碼代碼如下:
#include <iostream>
#include "sub.h"? //鏈接庫的頭文件
using namespaces std;
?
#pragma comment(lib,"sub.lib") //加入鏈接庫
int main()
{
??? sub(5,4);
??? return 0;
}
4.僅有.dll文件時候的使用方法
?
在沒有.h和.lib文件時,需要函數(shù)指針和WIN32 API函數(shù)LoadLibrary、GetProcAddress裝載,只需要.dll文件即可(將.dll文件置入工程目錄中)。
復制代碼代碼如下:
#include <iostream>
#include <windows.h>?????????????? //使用函數(shù)和某些特殊變量
typedef void (*DLLFunc)(int,int);? //確定調(diào)用函數(shù)的形參
int main()
{
??? DLLFunc dllFunc;
??? HINSTANCE hInstLibrary = LoadLibrary("sub.dll");//加載.dll
?
??? if (hInstLibrary == NULL)
??? {
??????? FreeLibrary(hInstLibrary);
??? }
??? dllFunc = (DLLFunc)GetProcAddress(hInstLibrary, "sub");//第二個參數(shù)為要調(diào)用的函數(shù)名稱
??? if (dllFunc == NULL)
??? {
??????? FreeLibrary(hInstLibrary);
??? }
??? dllFunc(5,4);
??? FreeLibrary(hInstLibrary);
??? return(1);
}
?
靜態(tài)調(diào)用dll
在新文件yyy.cpp里加入如下內(nèi)容;
#include "xxx.h"
#pragma comment(lib,"xxx.dll")
生成的dll,不包含xxx.h的話,需要把h文件內(nèi)的函數(shù)原型聲明添加進yyy.cpp
編譯時需要加入dll,類似這樣:
g++ -L. -o yyy.exe yyy.cpp xxx.dll
3)動態(tài)調(diào)用dll
首先,你需要包含windows.h
#include <windows.h>
你還需要一個句柄保存裝入的dll文件
HINSTANCE hDll=LoadLibrary("xxx.dll");
聲明所需函數(shù)的對應函數(shù)指針類型
typedef void (*pfunc)(void);
獲得指向函數(shù)的函數(shù)指針
pfunc pf=(pfunc*)GetProcAddress(hDll,"example");
使用完畢后,要釋放dll文件
FreeLibrary(hDll);
總結(jié)
以上是生活随笔為你收集整理的c++中.dll与.lib文件的生成与使用的详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从程序员到技术领导者
- 下一篇: Symbian系统开发教程(二)