WIN_靜態庫與動態庫

WIN_靜態庫與動態庫的加載  
一.  靜態庫包括.lib和.h文件,在工程中使用靜態庫分爲3步: <1> 在工程中加入靜態庫,有兩種方法: 
      **方法一:項目設置中引用.lib,project->   setting->   link->   object/library modules中添加.lib;(需要在tools/options設置正確的引用路徑) 
      **方法二:在項目中直接加入lib,project->   add to project->   files,選擇正確的.lib。 
         **方法三:pragma comment(lib, "##/##/mine.lib") ,路徑名,系統會優先查找環境path 
<2> 在工程中包括.h文件;(可能 需要在tools/options設置正確的引用路徑) <3> 在工程中使用靜態庫中的函數; 
  
二.   動態鏈接庫一般包括.lib(導入庫),.h,.dll文件,使用動態庫有兩種情況: A .  隱式鏈接:load-time dynamic linking 
同使用靜態庫相似,分爲三步:引用.lib導入庫,包含頭文件,使用導出函數; 此種方法的好處是:可以像使用靜態庫一樣直接調用函數 
缺點:程序啓動時加載所有需要的DLL,延長啓動時間,效率低。 B.   動態加載:run-time dynamic linking 
直接使用LoadLibrary或LoadLibraryEx 加載所需的動態庫(並不需要對應的頭文件,和LIB),然後指定所需的導出函數,效率最高!,但前提需要對DLL庫有比較詳細的瞭解。 缺點:需要使用GetProcessAddress()得到函數指針,函數調用相對麻煩。 
  
基本概念: 目標庫(靜態庫): 
  擴展名.lib,靜態連接,其代碼會加入到可執行程序中。 動態庫: 
  擴展名.dll,動態鏈接,發生在運行時。 輸入庫(導入庫): 


  擴展名.lib,目標庫的一種特殊形式。輸入庫不含代碼,而是爲鏈接程序提供信息,以便在.exe文件 中建立動態鏈接時要用到的重定位表。 
  輸入庫是動態庫的輔助庫,在vc中隱式導入動態庫的時候用到該庫,需要在引用該庫的文件中包含該 庫的頭文件  ,並讓連接程序能找到該輸入庫的位置(放在同一目錄下或在vc中作相應的設置)。 
  目標庫和輸入庫之用在程序的開發期間,動態庫在運行期間使用。 
  一般來說,vb導入動態庫時用顯式導入(LoadLibrary),vc用隱式導入簡單一些。 目前以lib後綴的庫有兩種,一種爲靜態鏈接庫(Static Libary,以下簡稱“靜態庫”),另一種爲動態連接庫(DLL,以下簡稱“動態庫”)的導入庫(Import Libary,以下簡稱“導入庫”)。   靜態庫是一個或者多個obj文件的打包,所以有人乾脆把從obj文件生成lib的過程稱爲Archive,即合併到一起。比如你鏈接一個靜態庫,如果其中有錯,它會準確的找到是哪個obj有錯,即靜態lib只是殼子。   
動態庫一般會有對應的導入庫,方便程序靜態載入動態鏈接庫,否則你可能就需要自己LoadLibary調入DLL文件,然後再手工GetProcAddress獲得對應函數了。有了導入庫,你只需要鏈接導入庫後按照頭文件函數接口的聲明調用函數就可以了。   
導入庫和靜態庫的區別很大,他們實質是不一樣的東西。靜態庫本身就包含了實際執行代碼、符號表等等,而對於導入庫而言,其實際的執行代碼位於動態庫中,導入庫只包含了地址符號表等,確保程序找到對應函數的一些基本地址信息。  開源代碼發佈的慣用方式: 
1. 預編譯的開發包:包含一些.dll文件和一些.lib文件。其中這裏的.lib就是導入庫,而不要錯以爲是靜態庫。但是引入方式和靜態庫一樣,要在鏈接路徑上添加找到這些.lib的路徑。而.dll則最好放到最後產生的應用程序exe執行文件相同的目錄。這樣運行時,就會自動調入動態鏈接庫。  
2. 用戶自己編譯: 下載的是源代碼,按照readme自己編譯。生成很可能也是.dll + .lib(導入庫)的庫文件  
3. 如果你只有dll,並且你知道dll中函數的函數原型,那麼你可以直接在自己程序中使用LoadLibary調入DLL文件,GetProcAddress 
  
一些導入函數的介紹:  
LoadLibrary 


 一般是動態加載DLL時(你並不需要對應的頭文件,和LIB),顯示加載dll中函數,前提是你自己對dll導出的函數參數很瞭解. #pragma comment 
一般是靜態加載DLL時(對應的頭文件、DLL,和LIB缺一不可,並且生產的EXE沒有找到DLL文件就會導致“應用程序初始化失敗”) #import 
 導入的dll是com組建的dll,主要用來解析com組建內部結構,便與c++識別調用 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章