靜態庫:函數和數據被編譯進一個二進制文件,通常擴展名為.lib,在使用靜態庫的情況下,在編譯鏈接可執行文件時,鏈接器從庫中復制這些函數和數據並把它們和應用程序的其它模塊組合起來創建最終的可執行文件。
動態庫:往往提供2個文件,一個是引入庫和一個DLL,引入庫包含被DLL導出的函數和變量的符號名,DLL包含實際的函數和數據。在編譯鏈接可執行文件時,只需要鏈接引入庫,DLL中的函數代碼和數據並不復制到可執行文件中,在運行的時候,再去加載DLL,訪問DLL中導出的函數。
使用DLL的好處:1.可以采用多種編程語言來編寫;2.增強產品的功能;3.提供二次開發的平台;4.簡化項目管理,同時進行開發;5.可以節省磁盤空間和內存,多個程序使用同一種資源;6.有助於資源的共享;7.有助於實現應用程序的本地化。
動態鏈接庫的加載兩種方式:
隱式鏈接:
①新建DLL的程序,在里面新建加法和減法兩個函數;
編譯后打開工程下的DEBUG文件夾,可以看到生成的dll文件;
打開Cmd命令床開,切換到此路徑下(復制文件路徑,在命令窗口里右鍵即粘貼),輸入dumpbin -exports Dll1.dll,可以看到該DLL導出的信息,如果dumpbin命令不識別,需要添加環境變量(我的安裝路徑是:C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.23.28105\bin\Hostx64\x64)
我們重新回到代碼中,在每個函數名前增加_declspec(dllexport),再重新編譯生成,發現生成的文件中多了一個Dll1.lib文件,這就是前面說的引入庫文件;
接着再重新運行cmd命令,可以看到我們導出的函數信息,因為c++具有重載功能,所以函數命名會按編譯器內部標識的一堆符號顯示。
測試一下結果:重新新建C++控制台程序,調用Add和Sub函數,在屬性里附加庫依賴項加入Dll1.lib,並把文件(Dll1.lib和Dll1.dll)復制到該目錄下;
紅色圈起來的是表明函數在外部定義,第一種效率比下面的高。
同樣可以使用dumpbin查看測試程序的輸入文件信息