函式和資料被編譯進乙個二進位制檔案(通常擴充套件名為.lib)。在使用靜態庫的情況下,在編譯鏈結可執行檔案時,鏈結器從庫中複製這些函式和資料並把它們和應用程式的其他模組組合起來建立最終的可執行檔案(.exe檔案)。當發布產品時,只需要發布這個可執行檔案,並不需要發布被使用的靜態庫。
在使用動態庫的時候,往往提供兩個檔案:乙個引入庫(.lib)檔案(也稱「導入庫檔案」)和乙個dll(.dll)檔案。雖然引入庫的字尾名也是「lib」,但是,動態庫的引入庫檔案和靜態庫檔案有著本質的區別,對乙個dll檔案來說,其引入庫檔案(.lib)包含該dll匯出的函式和變數的符號名,而.dll檔案包含該dll實際的函式和資料。在使用動態庫的情況下,在編譯鏈結可執行檔案時,只需要鏈結該dll的引入庫檔案,該dll中的函式**和資料並不可複製到可執行檔案,直到可執行程式執行時,才去載入所需的dll,將該dll對映到程序的位址空間中,然後訪問dll中匯出的函式。這時,在發布產品時,除了發布可執行檔案以外,同時還需要發布該程式將要呼叫的動態鏈結庫。
windows 系統平台上你可以將獨立的程式模組建立為較小的dll(dynamic linkable library)檔案,並可對它們單獨編譯和測試。在執行時,只有當exe程式確實要呼叫這些dll模組的情況下,系統才會將它們裝載到記憶體空間中。這種方式不僅減少了exe檔案的大小和對記憶體空間的需求,而且使這些dll模組可以同時被多個應用程式使用。windows自己就將一些主要的系統功能以 dll模組的形式實現。windows為應用程式提供了豐富的函式呼叫,這些函式呼叫都包含在動態鏈結庫中。其中有3個最重要的 dll:
kernel32.dll,它包含用於管理記憶體、程序和執行緒的各個函式;
user32.dll,它包含用於執行使用者介面任務(如視窗的建立和訊息的傳送)的各個函式;
gdi32.dll,它包含用於畫圖和顯示文字的各個函式。
當windows .exe程式被載入到記憶體中時,程式中的呼叫被指向dll函式的入口,如果dll不在記憶體中,系統就將其載入到記憶體中。當鏈結windows程式以產生乙個可執行檔案時,你必須鏈結由程式設計環境提供的專門的 「引入庫(import library)」。這些引入庫包含了動態鏈結庫名稱和所有windows函式呼叫的引用資訊。鏈結程式使用該資訊在.exe檔案中構造乙個表,當引導程式時,windows使用它將呼叫轉換為windows函式。
引入庫和靜態庫的區別很大,他們實質是不一樣的東西。靜態庫本身就包含了實際執行**、符號表等等,而對於引入庫而言,其實際的執行**位於動態庫中,引入庫只包含了位址符號表等,確保程式找到對應函式的一些基本位址資訊。但是引入庫檔案的引入方式和靜態庫一樣,要在鏈結路徑上新增找到這些.lib的路徑。
在vs中新增lib檔案的方法有兩種:
1)程式中標頭檔案之後通過pragma指定。
#pragma comment(lib,"../lib/libmysql.lib")
2)vs中指定目錄和庫名。
vs中新增lib庫和標頭檔案(外部依賴項)步驟:
1) 新增工程的頭檔案目錄:工程---屬性---配置屬性---c/c++---常規---附加包含目錄:加上標頭檔案存放目錄。
3) 新增工程引用的dll動態庫:把引用的dll放到工程的可執行檔案所在的目錄下。
vs專案屬性->配置屬性→c/c++→**生成→執行時庫 可以採用的方式有:多執行緒(/mt)、多執行緒除錯(/mtd)、多執行緒dll(/md)、多執行緒除錯dll(/mdd)。
/mt是 「multithread, static version」,意思是多執行緒靜態的版本,定義了它後,編譯器把libcmt.lib 安置到obj檔案中,讓鏈結器使用libcmt.lib 處理外部符號。
/md是 「multithread- and dll-specific version」,意思是多執行緒dll版本,定義了它後,編譯器把 msvcrt.lib 安置到obj檔案中,它連線到dll的方式是靜態鏈結,實際上工作的庫是msvcr80.dll。
即:靜態執行時庫:libcmt.lib
動態執行時庫:msvcrt.lib + msvcr80.dll
其中以小寫「d」結尾的選項表示的debug版本的,沒有「d」的為release版本。大型專案中必須要求所有元件和第三方庫的執行時庫是統一的,否則將會出現lnk2005井噴。
單執行緒執行時庫選項/ml和/mld在vs2003以後就被廢了。
參考:1. vs中c++新增lib庫和標頭檔案(外部依賴項)
2. 靜態庫和動態庫的區別,lib檔案和dll檔案的配置方法
3. vs 執行庫mt、md的區別
4. vc++編譯時執行庫選擇(/mt、/mtd、/md、/mdd)
動態庫和靜態庫
本文主要解決以下幾個問題 1 為什麼要使用庫?2 庫的分類 3 建立自己的庫 或許大家對自己初學linux時的情形仍記憶尤新吧。如果沒有乙個能較好的解決依賴關係的包管理器,在linux下安裝軟體將是一件及其痛苦的工作。你裝a包時,可能會提示你要先裝b包,當你費盡心力找到b包時,可能又會提示你要先安裝...
動態庫和靜態庫
先抄一段 windows下的動態庫和靜態庫區別解釋,其實linux下意義一樣的,不過字尾名有些區別 靜態庫 在編譯的時候載入生成目標檔案,在執行時不用載入庫,在執行時對庫沒有依賴性。動態庫 在目標檔案執行時載入,手動載入,且對庫有依賴性。兩者區別 一,靜態庫的使用需要 1 包含乙個對應的標頭檔案告知...
動態庫和靜態庫
簡單的說,使用動態庫就是在鏈結的時候,不會將動態庫的 鏈結到可執行檔案中,而是採用symbol的方式。使用靜態庫,生成可執行檔案的時候,會將靜態庫的 鏈結到可執行檔案中。這樣,動態庫體積會很小,並且可以,依賴於更新的動態庫,但是,缺點是不穩定。靜態庫會更加穩定,但是體積會很大。靜態庫 就是多個目標檔...