【目錄】
lib dll介紹
生成動態庫
呼叫動態庫
生成靜態庫
呼叫靜態庫
首先介紹一下靜態庫(靜態鏈結庫)、動態庫(動態鏈結庫)的概念,首先兩者都是**共享的方式。
靜態庫:在連線步驟中,聯結器將從庫檔案取得所需的**,複製到生成的可執行檔案中,這種苦稱為靜態庫,其特點是可執行檔案中包含了庫**的乙份完整拷貝;缺點就是被多次使用就會有多份冗餘拷貝。即靜態庫中的指令都全部被直接包含在最終生成的exe檔案中了。在vs中新建生成靜態庫的工程,編譯生成成功後,只產生乙個.lib檔案
動態庫:動態鏈結庫是乙個包含可由多個程式同時使用的**和資料的庫,dll不是可執行檔案。動態鏈結提供了一種方法,使程序可以呼叫不屬於其可執行**的函式。函式的可執行**位於乙個dll中,該dll包含乙個或多個已被編譯、鏈結並與使用它們的程序分開儲存的函式。在vs中新建生成動態庫的工程,編譯成功後,產生乙個.lib檔案和乙個.dll檔案
那麼上述靜態庫和動態庫中的lib有什麼區別呢?
靜態庫中的lib:該lib包含函式**本身(即包括函式的索引,也包括實現),在編譯時直接將**加入程式當中
動態庫中的lib:該lib包含了函式所在的dll檔案和檔案中函式位置的資訊(索引),函式實現**由執行時載入在程序空間中的dll提供
總之,lib是編譯時用到的,dll是執行時用到的。如果要完成源**的編譯,只需要lib;如果要使動態鏈結的程式執行起來,只需要dll。
以下例子均在vs2010上測試
生成和使用動態庫
生成動態庫
可以看到生成了乙個dllmain.cpp檔案,這是dll應用程式的入口,注意它和普通工程的入口main函式不同,這個檔案我們不需要修改。
在這個動態庫中我們舉例匯出乙個變數,乙個類,乙個函式,標頭檔案dll.h如下:
//新建生成dll的工程時,vs預設定義了巨集dll_export,因此,dll_api是__declspec(dllexport),用來匯出
//當我們在靜態呼叫dll時,我們包含該標頭檔案,由於沒有定義dll_export,所以dll_api是
//__declspec(dllimport),用來匯入
#ifdef dll_exports
#define dll_api __declspec(dllexport)
#else
#define dll_api __declspec(dllimport)
#endif
//匯出類
class dll_api cdll ;
//匯出變數,變數在.cpp檔案中定義
extern dll_api int ndll;
//匯出函式,加extern "c",是為了保證編譯時生成的函式名不變,這樣動態呼叫dll時才能
//正確獲取函式的位址
extern "c" dll_api int fndll(void);
dll.cpp檔案如下:
#include "dll.h"
//這是導演變數的乙個示例
dll_api int ndll=6;
//這是匯出函式的乙個示例
dll_api int fndll(void)
//這是已匯出類的建構函式
//有關類定義的資訊,請參閱dll.h
cdll::cdll()
呼叫動態庫
有兩種方法呼叫動態庫,一種隱式鏈結,一種顯式鏈結。
呼叫動態庫:隱式鏈結
隱式鏈結 需要.h檔案,dll檔案,lib檔案
(1) 將dll放到工程的工作目錄
(2) 設定專案屬性--vc++目錄--庫目錄為lib所在的路徑
(4) 在原始檔中新增.h標頭檔案
然後就像平常一樣呼叫普通函式、類、變數
呼叫動態庫:顯示鏈結
顯示鏈結只需要.dll檔案,但是這種呼叫方式不能呼叫dll中的變數或者類(其實可以呼叫類,但是相當麻煩,有興趣者可參考
顯示呼叫主要使用win32 api函式loadlibrary、getprocaddress,舉例如下:
typedef int (*dllfun)(void); //定義指向dll中函式的函式指標
hinstance hlib = loadlibrary(".\\dll.dll");
if (!hlib)
dllfun fun = (dllfun)getprocaddress(hlib, "fndll");
if (!fun)
fun();
生成和使用靜態庫
生成靜態庫
新建專案--win32專案--填寫專案名--確定--下一步--應用程式型別:選擇靜態庫
靜態庫專案沒有main函式,也沒有像dll專案中的dllmain。
建立專案後新增.h檔案,新增相應的匯出函式、變數或類,如下所示:
#ifndef _mylib_h_
#define _mylib_h_
void fun(int a);
extern int k;
class testclass
;#endif
.cpp檔案如下:
#include "stdafx.h"
#include "lib.h"
#include void fun(int a)
{ std::cout《編譯工程後就會生成乙個.lib檔案
使用靜態庫
需要.h檔案,lib檔案
(1)設定專案屬性--vc++目錄--庫目錄為lib所在的路徑
(3)在原始檔中新增.h標頭檔案
然後就像平常一樣呼叫普通函式、類、變數,舉例如下:
#include #include "lib.h"
#pargma comment(lib, "lib.lib")
int main()
{ fun(4);
std::cout<
lib和dll的區別,生成
首先介紹下靜態庫 靜態鏈結庫,lib檔案 動態庫 動態鏈結庫,dll檔案 的概念,首先兩者都是 共享的方式.靜態庫 在鏈結步驟中,聯結器將從庫檔案取得所需的 複製到生成的可執行檔案,這種庫稱為靜態庫,其特點是可執行檔案中包含了庫 的乙份完整拷貝 缺點就是被多次使用就會有多份冗餘拷貝.即靜態庫中的指令...
lib 和 dll 的區別 生成以及使用詳解
首先介紹一下靜態庫 靜態鏈結庫 動態庫 動態鏈結庫 的概念,首先兩者都是 共享的方式。靜態庫 在鏈結步驟中,聯結器將從庫檔案取得所需的 複製到生成的可執行檔案中,這種庫稱為靜態庫,其特點是可執行檔案中包含了庫 的乙份完整拷貝 缺點就是被多次使用就會有多份冗餘拷貝。即靜態庫中的指令都全部被直接包含在最...
lib 和 dll 的區別 生成以及使用詳解
lib 和 dll 的區別 生成以及使用詳解 目錄 lib dll介紹 生成動態庫 呼叫動態庫 生成靜態庫 呼叫靜態庫 首先介紹一下靜態庫 靜態鏈結庫 動態庫 動態鏈結庫 的概念,首先兩者都是 共享的方式。靜態庫 在鏈結步驟中,聯結器將從庫檔案取得所需的 複製到生成的可執行檔案中,這種庫稱為靜態庫,...