時間:2014.06.26
地點:基地
————————————————————————---------------
一、簡述所謂的庫文件
靜態鏈接就是把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鏈接到了目標代碼中。