關於靜態鏈接庫和動態鏈接庫

時間:2014.06.26

地點:基地

————————————————————————---------------

一、簡述所謂的庫文件

    每一個lib文件就是若干個函數的集合(假如只包含函數的話)。lib庫有兩種,一種庫是包含了函數所在的DLL文件和文件中函數位置的信息,稱爲導出庫;還一種是包含函數代碼本身。
    lib又有靜態lib和動態lib之分,靜態lib將導出聲明和實現都放在lib中,編譯後所有代碼嵌入到宿舍程序。而動態lib相當於一個h文件,是對實現部分(.dll文件)的導出部分的聲明,編譯後只是將導出聲明部分編譯到宿主程序中,運行時需要想要的dll文件支持。

    靜態鏈接就是把lib文件中用到的函數代碼直接鏈接到目標程序中,程序運行時無需其他庫文件。而動態鏈接就是把調用的函數所在文件模塊dll和調用函數在文件中的位置等信息鏈接到目標程序,程序在運行時再從dll中尋找相應的函數代碼,需要dll文件的支持。

   靜態鏈接庫和動態鏈接庫都是共享代碼的方式,採用靜態鏈接庫時,無論願意不願意,lib中的代碼都全部直接包含到最終生成的exe文件中,但若使用的是動態鏈接庫,則dll不必被包含在最終的exe文件中,只是exe文件在執行時可以動態地根據需要引用和卸載與該exe文件獨立開來的dll文件,靜態鏈接和動態鏈接的另一個區別即是靜態鏈接庫中不能再包含其他動態鏈接庫或靜態鏈接庫,這個層次是隻有一層的,而動態鏈接庫中還可以再包含其他動態鏈接庫或靜態鏈接庫,是可多層次的。

————————————————————————---------------

二、庫的調用

    通過#include包含函數聲明的頭文件後,應用程序就可以使用lib文件中的函數,還要指定編譯器鏈接相應的庫文件,在IDE環境下,一般一次指定所有要用到的庫文件,編譯器會自動尋找每個模塊所需要的庫,而在命令行編譯環境下,則需要指定每個某調用的庫。

2.1對靜態鏈接庫的調用

1.首先,靜態鏈接庫的使用需要庫的開發者提供生成庫的.h文件和lib文件
2.生成的.h頭文件中的聲明格式如下:
extern "C" 函數返回類型  函數名(參數列表)
3.在調用程序的.cpp源代碼時文件中如下格式:
#include "...\lib.h"
#pragma comment(lib,"...\\debug\\libTest,lib")

需要說明的是靜態鏈接庫時將全部指令都包含到調用程序生成的exe文件中,因此,也就不存在從靜態鏈接庫中導出某個函數給用戶使用的情況,要就得全要,不要就得全不要。

2.2動態鏈接庫的調用

根據動態鏈接庫的調用方法不同需提供不同的資源

2.2.1.靜態加載

程序靜態編譯時就靜態導入dll,這樣需提供.lib文件和.dll文件和.h文件,於是:
程序一開始運行就需要載入整個dll,無法載入程序就不能開始運行
由於載入的是整個dll,需要耗費更多的資源
調用方式如下:
#include "...\lib.h"
#pragma comment(lib,"...\\debug\\libTest.lib")
這種方式可以調用類方法

2.2.2.動態加載

  只需要提供dll文件,此時程序若想調用dll中的某個函數時就要以某種形式或方法指明它到底想要調用哪一個函數,但這樣無法調用類方法。
  我們知道cpp文件是源代碼,而庫文件時編譯後的二進制代碼,比如調用windows的API,但是這是看不到源代碼的。這便是調用靜態鏈接庫和直接給出函數定義和頭文件的區別。還有就是靜態鏈接庫中lib文件只要用到,則整個lib文件內容都放進exe文件中,這是在鏈接的時候將lib鏈接到了目標代碼中。
發佈了193 篇原創文章 · 獲贊 53 · 訪問量 36萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章