靜態庫
庫(Library)就是一段編譯好的二進制代碼,加上頭文件就可以使用。
靜態鏈接庫(Windows 下的*.lib, Linux & Mac 下的 .a)。之所以叫做靜態,是因為靜態庫在編譯的時候會被直接拷貝一份,復制到目標程序里,這段代碼在目標程序里就不會再改變了。
-
優點:
1、編譯完成之后,庫文件實際上就沒有作用了。目標程序沒有外部依賴,直接就可以運行。
2、代碼裝載速度快,執行速度略比動態鏈接庫快。 -
缺點:
1、會使用目標程序的體積增大。
2、包含相同的公共代碼,造成浪費,擴展性較差。
動態庫
動態鏈接庫(Windows 下的*.dll, Linux & Mac 下的 .dylib)。與靜態庫相反,動態庫在編譯時並不會被拷貝到目標程序中,目標程序中只會存儲指向動態庫的引用。等到程序運行時,動態庫才會被真正加載進來。
-
優點:
1、不需要拷貝到目標程序中,不會影響目標程序的體積,而且同一份庫可以被多個程序使用(因為這個原因,動態庫也被稱作共享庫)。同時,編譯時才載入的特性,也可以讓我們隨時對庫進行替換,而不需要重新編譯代碼。
2、更加節省內存並減少頁面交換。
3、可維護性和可擴展性高。
4、適用於大規模的軟件開發,使開發過程獨立、耦合度小,便於不同開發者和開發組織之間進行開發和測試。 -
缺點:
1、動態載入會帶來一部分性能損失,使用動態庫也會使得程序依賴於外部環境。
2、如果環境缺少動態庫或者庫的版本不正確,就會導致程序無法運行(Linux 下喜聞樂見的 lib not found 錯誤)。
三種DLL(Win32DLL,MFC常規DLL和MFC拓展DLL)
學習了三種動態鏈接庫的基本知識,分別是Win32DLL,MFC常規DLL和MFC拓展DLL。
Win32DLL使用的是Win32的API實現的,只能導出函數,能被各種應用程序調用,適用范圍最廣。
MFC常規DLL是適用MFC創建的,就像MFC程序跟Win32程序的關系一樣,MFC常規DLL和Win32DLL的關系也是如此。它使用MFC的機制,只能導出標准C函數。如此,它便可以被大部分Win32程序調用。
MFC拓展DLL也也使用的是MFC機制創建的,相比於MFC常規DLL,拓展DLL可以導出C++類和MFC派生類,如此擴大了DLL的接口范圍。此長彼消,MFC拓展DLL的適用范圍較小,只能被MFC程序調用。因為它導出的不只是函數,還有C++類和MFC派生類。
另外,所有的動態鏈接庫都有兩種鏈接方式:隱式調用和顯示調用。隱式鏈接使用起來比較方便,不過不夠靈活;顯示鏈接可以在真正要用DLL的時候才裝入,並在適當的時候釋放,操作相對復雜一些。
版權聲明
1.
版權聲明:本文為CSDN博主「wche1990」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/wche1990/article/details/6944647
2.
作者:乂濫好人
鏈接:https://www.jianshu.com/p/58f29bb5df45
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。