簡單地講:
第一:.DLL是動态連結庫,而.LIB是靜态連結庫
dll是個編譯好的程式,調用時可以直接調用其中的函數,不參加工程的編譯. 而lib應該說是一個程式集, 隻是把一些相應的函數總結在一起, 如果調用lib中的函數,在工程編譯時,這些調用的函數都将參加編譯.
第二:從記憶體管理的角度來看,lib必須被連結到主程式中,主程式進入記憶體,lib也同時進入記憶體。而dll則是需要用到它的時候由作業系統調入記憶體。從複用性的角度來看,lib因為必須參加編譯,是以複用性就不如DLL。
下面文章為轉載:
【目錄】
lib dll介紹
生成動态庫
調用動态庫
生成靜态庫
調用靜态庫
首先介紹一下靜态庫(靜态連結庫)、動态庫(動态連結庫)的概念,首先兩者都是代碼共享的方式。
靜态庫:在連結步驟中,連接配接器将從庫檔案取得所需的代碼,複制到生成的可執行檔案中,這種庫稱為靜态庫,其特點是可執行檔案中包含了庫代碼的一份完整拷貝;缺點就是被多次使用就會有多份備援拷貝。即靜态庫中的指令都全部被直接包含在最終生成的 EXE 檔案中了。在vs中建立生成靜态庫的工程,編譯生成成功後,隻産生一個.lib檔案
動态庫:動态連結庫是一個包含可由多個程式同時使用的代碼和資料的庫,DLL不是可執行檔案。動态連結提供了一種方法,使程序可以調用不屬于其可執行代碼的函數。函數的可執行代碼位于一個 DLL 中,該 DLL 包含一個或多個已被編譯、連結并與使用它們的程序分開存儲的函數。在vs中建立生成動态庫的工程,編譯成功後,産生一個.lib檔案和一個.dll檔案
那麼上述靜态庫和動态庫中的lib有什麼差別呢?
靜态庫中的lib:該LIB包含函數代碼本身(即包括函數的索引,也包括實作),在編譯時直接将代碼加入程式當中
動态庫中的lib:該LIB包含了函數所在的DLL檔案和檔案中函數位置的資訊(索引),函數實作代碼由運作時加載在程序空間中的DLL提供
總之,lib是編譯時用到的,dll是運作時用到的。如果要完成源代碼的編譯,隻需要lib;如果要使動态連結的程式運作起來,隻需要dll。
以下例子均在vs2010上測試
生成和使用動态庫
建立項目--win32項目--填寫項目名--确定--下一步--應用程式類型:選擇dll--附加選項:選擇導出符号--完成
可以看到生成了一個dllmain.cpp 檔案,這是dll應用程式的入口,注意它和普通工程的入口main函數不同,這個檔案我們不需要修改。
在這個動态庫中我們舉例導出一個變量,一個類,一個函數,頭檔案dll.h如下:

1 //建立生成dll的工程時,vs預設定義了宏DLL_EXPORT,是以,DLL_API 是 __declspec(dllexport),用來導出
2 //當我們在靜态調用dll時,我們包含該頭檔案,由于沒有定義DLL_EXPORT,是以DLL_API是
3 //__declspec(dllimport),用來導入
4 #ifdef DLL_EXPORTS
5 #define DLL_API __declspec(dllexport)
6 #else
7 #define DLL_API __declspec(dllimport)
8 #endif
9
10 // 導出類
11 class DLL_API Cdll {
12 public:
13 Cdll(void);
14 // TODO: 在此添加您的方法。
15 };
16
17 //導出變量,變量在.cpp檔案中定義
18 extern DLL_API int ndll;
19
20 //導出函數,加extern "C",是為了保證編譯時生成的函數名不變,這樣動态調用dll時才能
21 //正确擷取函數的位址
22 extern "C" DLL_API int fndll(void);

dll.cpp 檔案如下:

1 #include "dll.h"
2
3
4 // 這是導出變量的一個示例
5 DLL_API int ndll=6;
6
7 // 這是導出函數的一個示例。
8 DLL_API int fndll(void)
9 {
10 return 42;
11 }
12
13 // 這是已導出類的構造函數。
14 // 有關類定義的資訊,請參閱 dll.h
15 Cdll::Cdll()
16 {
17 return;
18 }

有兩種方法調用動态庫,一種隐式連結,一種顯示連結。
調用動态庫:隐式連結
隐式連結 需要.h檔案,dll檔案,lib檔案
(1)将dll放到工程的工作目錄
(2)設定項目屬性--vc++目錄--庫目錄為lib所在的路徑
(3)将lib添加到項目屬性--連結器--輸入--附加依賴項(或者直接在源代碼中加入#pragma comment(lib, “**.lib”))
(4)在源檔案中添加.h頭檔案
然後就像平常一樣調用普通函數、類、變量
調用動态庫:顯示連結
顯示連結 隻需要.dll檔案,但是這種調用方式不能調用dll中的變量或者類(其實可以調用類,但是相當麻煩,有興趣者可參考http://blog.csdn.net/jdcb2001/article/details/1394883)
顯示調用主要使用WIN32 API函數LoadLibrary、GetProcAddress,舉例如下:

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

生成和使用靜态庫
建立項目--win32項目--填寫項目名--确定--下一步--應用程式類型:選擇靜态庫
靜态庫項目沒有main函數,也沒有像dll項目中的dllmain。
建立項目後添加.h檔案,添加相應的導出函數、變量或類,如下所示

1 #ifndef _MYLIB_H_
2 #define _MYLIB_H_
3
4 void fun(int a);
5
6 extern int k;
7
8 class testclass
9 {
10 public:
11 testclass();
12 void print();
13 };
14
15 #endif

.cpp檔案如下

1 #include "stdafx.h"
2 #include "lib.h"
3 #include <iostream>
4
5 void fun(int a)
6 {
7 std::cout<<a<<"lib gen\n";
8 }
9
10 int k = 222;
11
12 testclass::testclass()
13 {
14 std::cout<<"123\n";
15 }
16
17 void testclass::print()
18 {
19 std::cout<<"this is testcalss\n";
20 }

編譯工程後就會生成一個.lib檔案
使用靜态庫
需要.h檔案,lib檔案
(1)設定項目屬性--vc++目錄--庫目錄為lib所在的路徑
(2)将lib添加到項目屬性--連結器--輸入--附加依賴項(或者直接在源代碼中加入#pragma comment(lib, “**.lib”))
(3)在源檔案中添加.h頭檔案
然後就像平常一樣調用普通函數、類、變量,舉例如下:
1 #include <iostream>
2 #include "lib.h"
3
4 #pragma comment(lib, "lib.lib")
5
6 int main()
7 {
8 fun(4);
9 std::cout<<k<<std::endl;
10 testclass tc;
11 tc.print();
12 return 0;
13 }
轉載出處 http://www.cnblogs.com/TenosDoIt/p/3203137.html