lib(靜態庫)
- 靜態庫定義:
.lib
文件是靜態庫文件,包含了在編譯時被鏈接到目標程序的代碼。使用靜態庫時,庫的代碼會被復制到最終生成的可執行文件中。 - 優點:
- 性能:由于庫代碼在編譯時就被集成到可執行文件中,所以在運行時不需要加載外部文件,通常有更好的性能。
- 分發方便:無需在分發應用程序時包含額外的庫文件,因為所有代碼都已包含在可執行文件中。
- 缺點:
- 占用空間:由于每個使用靜態庫的可執行文件都包含了庫的代碼,所以會導致生成的可執行文件較大。
- 更新不便:如果庫代碼需要更新,則必須重新編譯每個使用該庫的應用程序。
dll(動態庫)
- 動態庫定義:
.dll
文件是動態鏈接庫文件,包含了在運行時被加載的代碼。使用動態庫時,庫的代碼在程序運行時才被加載,并且可以被多個程序共享使用。 - 優點:
- 節省內存:多個程序可以共享同一個動態庫實例,節省內存。
- 易于更新:更新動態庫時,只需要替換舊的
.dll
文件,而無需重新編譯依賴該庫的所有程序。
- 缺點:
- 依賴性:應用程序在運行時必須能夠找到并加載所需的動態庫文件,否則會報錯。
- 加載開銷:在程序運行時加載庫文件會增加一些開銷。
使用場景
- 靜態庫適用于那些不經常更新,并且不需要被多個程序共享的代碼模塊。
- 動態庫則適用于需要被多個程序共享,并且可能需要頻繁更新的代碼模塊。
在VS2022中的使用
- 創建靜態庫:在VS2022中,可以通過選擇“靜態庫(.lib)”項目類型來創建靜態庫。編譯后會生成一個
.lib
文件和相關的頭文件。 - 創建動態庫:同樣,可以通過選擇“動態鏈接庫(.dll)”項目類型來創建動態庫。編譯后會生成一個
.dll
文件以及一個與其對應的.lib
文件(用于鏈接時使用)和頭文件。
小結
lib
文件主要用于靜態鏈接,在編譯時合并到可執行文件中。dll
文件用于動態鏈接,在運行時加載,支持代碼共享和動態更新。
靜態庫中的lib
- 包含函數定義:靜態庫(
.lib
)文件包含了所有需要的函數定義和實現。鏈接時,編譯器會將這些函數的代碼直接復制到目標可執行文件中。這意味著生成的可執行文件包含了庫中所有用到的代碼。
動態庫中的lib
- 不包含函數定義:動態庫(
.dll
)的lib
文件(有時稱為“導入庫”)不包含函數的實際實現代碼。相反,它包含了動態庫中導出的函數的符號和地址信息,用于在鏈接時告訴編譯器這些函數在動態庫中實際存在。這種lib
文件本質上是一個指向.dll
文件中函數實現的“指針”。
總結
- 靜態庫的
.lib
文件:包含了所有函數的完整實現。 - 動態庫的
.lib
文件:不包含函數實現,僅包含函數的符號信息,用于鏈接時指向對應的.dll
文件。
在解決方案中,一個DLL工程中和一個Lib工程,DLL工程調用Lib工程需要添加附加依賴項和附加庫目錄
如果是在一個解決方案(solution)下,在DLL中可以引用Lib工程,這樣就不需要添加附加依賴項和附加依賴庫了,如下圖: