靜態庫和動態庫的區別(轉)

lib和dll文件的區別和聯繫    
   
  .dll是在你的程序運行的時候才連接的文件,因此它是一種比較小的可執行文件格式,.dll還有其他的文件格式如.ocx等,所有的.dll文件都是可執行。  
   
  .lib是在你的程序編譯連接的時候就連接的文件,因此你必須告知編譯器連接的lib文件在那裏。一般來說,與動態連接文件相對比,lib文件也被稱爲是靜態連接庫。當你把代碼編譯成這幾種格式的文件時,在以後他們就不可能再被更改。如果你想使用lib文件,就必須:  
  1?   包含一個對應的頭文件告知編譯器lib文件裏面的具體內容  
  2?   設置lib文件允許編譯器去查找已經編譯好的二進制代碼  
   
  如果你想從你的代碼分離一個dll文件出來代替靜態連接庫,仍然需要一個lib文件。這個lib文件將被連接到程序告訴操作系統在運行的時候你想用到什麼 dll文件,一般情況下,lib文件裏有相應的dll文件的名字和一個指明dll輸出函數入口的順序表。如果不想用lib文件或者是沒有lib文件,可以用WIN32   API函數LoadLibrary、GetProcAddress。事實上,我們可以在Visual   C++   IDE中以二進制形式打開lib文件,大多情況下會看到ASCII碼格式的C++函數或一些重載操作的函數名字。  
   
  一般我們最主要的關於lib文件的麻煩就是出現unresolved   symble   這類錯誤,這就是lib文件連接錯誤或者沒有包含.c、.cpp文件到工程裏,關鍵是如果在C++工程裏用了C語言寫的lib文件,就必需要這樣包含:  
  extern   "C"  
  {  
  #include   "myheader.h"  
  }  
  這是因爲C語言寫的lib文件沒有C++所必須的名字破壞,C函數不能被重載,因此連接器會出錯。Top

C語言中有一些函數不需要進行編譯,有一些函數也可以在多個文件中使用。一般來說,這些函數都會執行一些標準任務,如數據庫輸入/輸出操作或屏幕控制等。可以事先對這些函數進行編譯,然後將它們放置在一些特殊的目標代碼文件中,這些目標代碼文件就稱爲庫。庫文件中的函數可以通過連接程序與應用程序進行連接。這樣就不必在每次開發程序時都對這些通用的函數進行編譯了。    
   
    不同類型的應用程序將會使用不同的函數庫。例如:libdbm庫中組包含了對數據庫文件進行訪問的dbm函數,需要對數據庫進行操作的程序就會與該庫進行連接。數學應用程序將使用數學庫libm,X-Windows應用程序將使用Xlib庫,libX11。另外,所有的程序都將使用標準的C函數庫。 libc,該庫中包含了諸好內存管理或輸入輸出操作的基本函數,這些庫都存放在/usr/lib這些系統公用的目錄中,系統中的任何用戶都可以利用這些庫。當然用戶也可以建立自己專用的庫函數,供自己或其它指定的人員使用。    
   
    庫可以有三種使用的形式:靜態、共享和動態。靜態庫的代碼在編譯時就已連接到開發人員開發的應用程序中,而共享庫只是在程序開始運行時才載入,在編譯時,只是簡單地指定需要使用的庫函數。動態庫則是共享庫的另一種變化形式。動態庫也是在程序運行時載入,但與共享庫不同的是,使用的庫函數不是在程序運行開始,而是在程序中的語句需要使用該函數時才載入。動態庫可以在程序運行期間釋放動態庫所佔用的內存,騰出空間供其它程序使用。由於共享庫和動態庫並沒有在程序中包括庫函數的內容,只是包含了對庫函數的引用,因此代碼的規模比較小。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章