windows動態庫和靜態庫VS導入


1. 靜態庫和動態庫

1.1 靜態庫(.lib)

函數和數據被編譯進一個二進制文件(通常擴展名為.LIB)。在使用靜態庫的情況下,在編譯鏈接可執行文件時,鏈接器從庫中復制這些函數和數據並把它們和應用程序的其他模塊組合起來創建最終的可執行文件(.EXE文件)。當發布產品時,只需要發布這個可執行文件,並不需要發布被使用的靜態庫。

1.2 動態庫(.lib文件和.dll文件)

在使用動態庫的時候,往往提供兩個文件:一個引入庫(.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函數。

1.3 引入庫和靜態庫的區別

 引入庫和靜態庫的區別很大,他們實質是不一樣的東西。靜態庫本身就包含了實際執行代碼、符號表等等,而對於引入庫而言,其實際的執行代碼位於動態庫中,引入庫只包含了地址符號表等,確保程序找到對應函數的一些基本地址信息。但是引入庫文件的引入方式和靜態庫一樣,要在鏈接路徑上添加找到這些.lib的路徑。

2.  VS鏈接lib文件

在VS中添加lib文件的方法有兩種:

1)程序中頭文件之后通過pragma指定。

#pragma comment(lib,"../lib/libmysql.lib")

2)VS中指定目錄和庫名。

2.1 VS導入庫和頭文件

VS中添加lib庫和頭文件(外部依賴項)步驟:

1) 添加工程的頭文件目錄:工程---屬性---配置屬性---c/c++---常規---附加包含目錄:加上頭文件存放目錄。

2) 添加文件引用的lib靜態庫路徑:工程---屬性---配置屬性---鏈接器---常規---附加庫目錄:加上lib文件存放目錄。

然后添加工程引用的lib文件名:工程---屬性---配置屬性---鏈接器---輸入---附加依賴項:加上lib文件名。

3) 添加工程引用的dll動態庫:把引用的dll放到工程的可執行文件所在的目錄下。

3. VS運行庫MT和MD區別

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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM