天天看點

LIB和DLL的差別,生成以及使用

參考該部落格:https://www.cnblogs.com/TenosDoIt/p/3203137.html

1.基本概念

首先,介紹下動态連結庫和靜态連結庫的概念,兩者都是代碼共享的方式。

靜态庫:在連結步驟中,連結器将從庫檔案中取得代碼,複制到可執行檔案中,此種稱為靜态庫。其特點是可執行檔案中包含了庫代碼的一份完整拷貝;缺點就是被多次使用就會有多份備援拷貝。即靜态庫中的指令都全部被直接包含在最終生成的 EXE 檔案中了。在vs中建立生成靜态庫的工程,編譯生成成功後,隻産生一個.lib檔案

動态庫:動态連結庫是一個包含可由多個程式同時使用的代碼和資料的庫,DLL不是可執行檔案。動态連結提供了一種方法,使程序可以調用不屬于其可執行代碼的函數。函數的可執行代碼位于一個 DLL 中,該 DLL 包含一個或多個已被編譯、連結并與使用它們的程序分開存儲的函數。在vs中建立生成動态庫的工程,編譯成功後,産生一個.lib檔案和一個.dll檔案

2.靜态庫和動态庫的LIB檔案有什麼差別呢?

靜态庫中的LIB:該LIB包含函數代碼本身(即包括函數的索引,也包括實作),在編譯時直接将代碼加入程式當中。

動态庫中的LIB:該LIB包含了函數所在的DLL檔案和檔案中函數位置的資訊(索引),函數實作代碼由運作時加載在程序空間中的DLL提供。

備注:LIB是編譯時用到的,DLL是運作時用到的。如果要完成源代碼的編譯,隻需要LIB;如果要使動态連結的程式運作起來,隻需要DLL。

3.生成和使用動态連結庫

 3.1生成動态連結庫

建立C++ DLL工程如下,選中【導出符号】

LIB和DLL的差別,生成以及使用

選中導出符号

建立工程的預設頭檔案如下:

//-------------------------------------------------------------------------
// 建立生成DLL工程時,選中了【導出符号】,VS預設定義了宏CREATEDLL_EXPORTS,是以
// 當CREATEDLL_EXPORTS被定義時,CREATEDLL_API用于導出;當使用DLL時,
// CREATEDLL_EXPORTS未定義,CREATEDLL_API用于導入
//-------------------------------------------------------------------------
#ifdef CREATEDLL_EXPORTS
#define CREATEDLL_API __declspec(dllexport)
#else
#define CREATEDLL_API __declspec(dllimport)
#endif

// 此類是從 CreateDLL.dll 導出的
class CREATEDLL_API CCreateDLL {
public:
	CCreateDLL(void);
	// TODO:  在此添加您的方法。
};

extern CREATEDLL_API int nCreateDLL;

CREATEDLL_API int fnCreateDLL(void);
           

預設的源檔案如下:

#include "stdafx.h"
#include "CreateDLL.h"
// 這是導出變量的一個示例
CREATEDLL_API int nCreateDLL=0;

// 這是導出函數的一個示例。
CREATEDLL_API int fnCreateDLL(void)
{
    return 42;
}

// 這是已導出類的構造函數。
// 有關類定義的資訊,請參閱 CreateDLL.h
CCreateDLL::CCreateDLL()
{
    return;
}
           

點選【編譯】即可編譯LIB和DLL檔案。

3.2使用動态連結庫

調用動态連結庫有兩種方法:隐式調用、顯示調用

  • 隐式調用:需要.h檔案、DLL檔案、LIB檔案
    • 将DLL放在工程的工作目錄;
    • 設定項目屬性->VC++目錄->庫目錄為LIB所在的路徑;
    • 将LIB添加到項目屬性->連結器->輸入->附加依賴項;(或者#pragma comment(lib, “**.lib”))
    • 在源檔案中添加.h檔案
  • 顯示調用:隻需要DLL檔案,這種方法需要通過WIN32 API加載函數和變量,比較麻煩
LIB和DLL的差別,生成以及使用

隐式調用