C# - *.dll vs *.lib (動態鏈接庫 vs 靜態鏈接庫)


靜態庫

庫(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
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

 


免責聲明!

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



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