c++靜態(tài)庫與動態(tài)庫的區(qū)別_第1頁
c++靜態(tài)庫與動態(tài)庫的區(qū)別_第2頁
c++靜態(tài)庫與動態(tài)庫的區(qū)別_第3頁
全文預覽已結束

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、 c+靜態(tài)庫與動態(tài)庫的區(qū)別分類: C+2012-11-26 11:41 3621人閱讀 評論(1) 收藏 舉報如果對Linux下靜態(tài)鏈接庫和動態(tài)鏈接庫感興趣,請狂點擊 ->你懂的一,概念        1)靜態(tài)鏈接庫就是你使用的.lib文件,庫中得代碼最后需要連接到你的可執(zhí)行文件中去,所以靜態(tài)連接的可執(zhí)行文件一般比較大一些。       使用方法    

2、0;                1>  格式如:#pragma comment(lib,"XXX.lib")                     2>  針對開發(fā)環(huán)境:  

3、;                                 1、如果使用VC,可以在Project Setting->Link中加入你的靜態(tài)庫,也可以直接把該.lib文件加入到你的工程中      

4、                             2、如果使用Visual Studio,位置在 項目配置屬性連接器輸入附加依賴項 中加入.lib文件       構造方法      

5、0;                     在靜態(tài)庫情況下,函數和數據被編譯進一個二進制文件(通常擴展名為*.lib),Visual C+的編譯器在鏈接過程中將從靜態(tài)庫中恢復這些函數和數據并把他們和應用程序中的其他模塊組合在一起生成可執(zhí)行文件。這個過程稱為"靜態(tài)鏈接",此時因為應用程序所需的全部內容都是從庫中復制了出來,所以靜態(tài)庫本身并不需要與可執(zhí)行文件一起發(fā)行。 

6、              編程使用:使用lib需注意兩個文件:                       (1).h頭文件,包含lib中說明輸出的類或符號原型或數據結構。應用程序調用lib時,需要將該文件包含入應用程序的源文件中。

7、60;                      (2).lib文件,見上面。         2)Dynamic Link Library 的縮寫形式,DLL是一個包含可由多個程序同時使用的代碼和數據的庫,DLL不是可執(zhí)行文件。動態(tài)鏈接提供了一種方法,使進程可以調用不屬于其可執(zhí)行代碼的函數。函數的可執(zhí)行代碼

8、位于一個 DLL 中,該 DLL 包含一個或多個已被編譯、鏈接并與使用它們的進程分開存儲的函數。DLL 還有助于共享數據和資源。多個應用程序可同時訪問內存中單個DLL 副本的內容。DLL 是一個包含可由多個程序同時使用的代碼和數據的庫。               DLL舉例               &#

9、160;               ActiveX 控件(.ocx) 文件: 示例是日歷控件,它使您可以從日歷中選擇日期。 ·                           

10、;   控制面板(.cpl) 文件 :cpl 文件的一個示例是位于控制面板中的項。每個項都是一個專用 DLL。·                     設備驅動(.drv) 文件                編程使用

11、;                           使用dll需注意三個文件:                     

12、60;               (1).h頭文件,包含dll中說明輸出的類或符號原型或數據結構的.h文件。應用程序調用dll時,需要將該文件包含入應用程序的源文件中。                        &

13、#160;            (2).LIB文件,是dll在編譯、鏈接成功之后生成的文件,作用是當其他應用程序調用dll時,需要將該文件引入應用程序,否則產生錯誤。如果不想用lib文件或者沒有l(wèi)ib文件,可以用WIN32 API函數LoadLibrary、GetProcAddress裝載。                &#

14、160;                   (3).dll文件,真正的可執(zhí)行文件,開發(fā)成功后的應用程序在發(fā)布時,只需要有.exe文件和.dll文件,并不需要.lib文件和.h頭文件。二,初步認識               共有兩種庫:   

15、60;                         一種是lib包含了函數所在的DLL文件和文件中函數位置的信息(入口),代碼由運行時加載在進程空間中的DLL提供,稱為動態(tài)鏈接庫dynamic link library。           &#

16、160;                 一種是lib包含函數代碼本身,在編譯時直接將代碼加入程序當中,稱為靜態(tài)鏈接庫static link library。              共有兩種鏈接方式:         

17、;                   動態(tài)鏈接使用動態(tài)鏈接庫,允許可執(zhí)行模塊(.dll文件或.exe文件)僅包含在運行時定位DLL函數的可執(zhí)行代碼所需的信息。                     

18、0;      靜態(tài)鏈接使用靜態(tài)鏈接庫,鏈接器從靜態(tài)鏈接庫lib獲取所有被引用函數,并將庫同代碼一起放到可執(zhí)行文件中。三,關于lib和dll的區(qū)別如下:            (1)lib是編譯時用到的,dll是運行時用到的。如果要完成源代碼的編譯,只需要lib;如果要使動態(tài)鏈接的程序運行起來,只需要dll。           

19、; (2)如果有dll文件,那么lib一般是一些索引信息,記錄了dll中函數的入口和位置,dll中是函數的具體內容;如果只有l(wèi)ib文件,那么這個lib文件是靜態(tài)編譯出來的,索引和實現都在其中。使用靜態(tài)編譯的lib文件,在運行程序時不需要再掛動態(tài)庫,缺點是導致應用程序比較大,而且失去了動態(tài)庫的靈活性,發(fā)布新版本時要發(fā)布新的應用程序才行。            (3)動態(tài)鏈接的情況下,有兩個文件:一個是LIB文件,一個是DLL文件。LIB包含被DLL導出的函數名稱和位置,DLL包含實際的函

20、數和數據,應用程序使用LIB文件鏈接到DLL文件。在應用程序的可執(zhí)行文件中,存放的不是被調用的函數代碼,而是DLL中相應函數代碼的地址,從而節(jié)省了內存資源。DLL和LIB文件必須隨應用程序一起發(fā)行,否則應用程序會產生錯誤。如果不想用lib文件或者沒有l(wèi)ib文件,可以用WIN32 API函數LoadLibrary、GetProcAddress裝載。 使用lib的方法:                  

21、60;  靜態(tài)lib中,一個lib文件實際上是任意個obj文件的集合,obj文件是cpp文件編譯生成的。在編譯這種靜態(tài)庫工程時,根本不會遇到鏈接錯誤;即使有錯,也只會在使用這個lib的EXT文件或者DLL工程里暴露出來。                    在VC中新建一個static library類型的工程Lib,加入test.cpp文件和test.h文件(頭文件內包括函數聲明),然后編譯,

22、就生成了Lib.lib文件。別的工程要使用這個lib有兩種方式:                    (1)在project->link->Object/Library Module中加入Lib.lib文件(先查詢工程目錄,再查詢系統(tǒng)Lib目錄);或者在源代碼中加入指令#pragma comment(lib, “Lib.lib”)。     &

23、#160;              (2)將Lib.lib拷入工程所在目錄,或者執(zhí)行文件生成的目錄,或者系統(tǒng)Lib目錄中。                    (3)加入相應的頭文件test.h。使用DLL的方法:     &

24、#160;             使用動態(tài)鏈接中的lib,不是obj文件的集合,即里面不會有實際的實現,它只是提供動態(tài)鏈接到DLL所需要的信息,這種lib可以在編譯一個DLL工程時由編譯器生成。                   創(chuàng)建DLL工程的方法(略)。   &

25、#160;              (1)隱式鏈接                           第一種方法是:通過project->link->Object/Library Module中

26、加入.lib文件(或者在源代碼中加入指令#pragma comment(lib, “Lib.lib”)),并將.dll文件置入工程所在目錄,然后添加對應的.h頭文件。html #include "stdafx.h" #include "DLLSample.h"  #pragma comment(lib, "DLLSample.lib") /你也可以在項目屬性中設置庫的鏈接  int main()   TestDLL(123); /dll中的函數,

27、在DllSample.h中聲明  return(1);                   (2)顯式鏈接                        

28、60;    需要函數指針和WIN32 API函數LoadLibrary、GetProcAddress裝載,使用這種載入方法,不需要.lib文件和.h頭文件,只需要.dll文件即可(將.dll文件置入工程目錄中)。html #include <iostream> #include <windows.h> /使用函數和某些特殊變量 typedef void (*DLLFunc)(int); int main()   DLLFunc dllFunc;  H

29、INSTANCE hInstLibrary = LoadLibrary("DLLSample.dll");   if (hInstLibrary = NULL)    FreeLibrary(hInstLibrary);    dllFunc = (DLLFunc)GetProcAddress(hInstLibrary, "TestDLL");  if (dllFunc = NULL)    FreeLibrary(hInstLibrary);    dllFunc(123);  std:cin.get();  FreeLibrary(hInstLibrary);  return(1);          &

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論