最近,做一些程式的封裝,就了解了c++中封裝動態庫(.dll)和靜態庫(.lib)的方法,以及兩種庫呼叫時異同,現在記錄下,後續有新的理解,會繼續更新;
動態庫(.dll):動態庫又稱
動態鏈結庫
英文為dll,是dynamic link library 的縮寫形式,dll是乙個包含可由多個程式同時使用的**和資料的庫,dll不是可執行檔案。動態鏈結提供了一種方法,使程序可以呼叫不屬於其
可執行**
靜態庫(.lib):靜態庫是指在我們的應用中,有一些公共**是需要反覆使用,就把這些**編譯為「庫」檔案;在鏈結步驟中,聯結器將從庫檔案取得所需的**,複製到生成的
可執行檔案
區別:靜態庫和
動態庫是兩種共享程式**的方式,它們的區別是:靜態庫在程式的鏈結階段被複製到了程式中,和程式執行的時候沒有關係;動態庫在鏈結階段沒有被複製到程式中,而是程式在執行時由系統動態載入到記憶體中供程式呼叫。使用動態庫的優點是系統只需載入一次動態庫,不同的程式可以得到記憶體中相同的動態庫的副本,因此節省了很多記憶體。
編譯.dll檔案:
暫 空 :)
編譯.lib檔案:
暫 空 :)
下面主要談談這兩種庫的呼叫:
在我們**編譯應用程式呼叫.dll庫時,需要在vs中配置環境:
1.附加包含目錄../include
2.附加庫目錄:../lib
3.附加依賴項:.lib
說明:編譯dll庫時,會生成.dll、.lib檔案(以及自帶的標頭檔案),其中呼叫函式的**封裝在.dll檔案中——新增環境變數(或直接拷貝到庫目錄下,直接在庫目錄的路徑中包含),函式的呼叫位址及其他記憶體資訊封裝在.lib檔案中——附加依賴項中新增相應的名稱***.lib,函式的介面在標頭檔案中(.h)——包含目錄;
另:1)在新增目錄的時候,應多考慮使用相對路徑(便於**的移植);
2)如果我們需要將編譯的應用程式.exe檔案在其他的電腦上執行,需要打包它需要呼叫的.dll檔案(放在同一目錄下),呼叫的dll檔案包括:自己編譯的dll檔案和vc編譯器執行庫的dll檔案(msvcp110d.dll,msvcr110d.dll ),不用打包.lib檔案,因為在編譯應用程式的時候,已經將.lib檔案包含到生成的.exe檔案;
3)編譯.exe 應用程式有兩種模式:debug和release,其中,d模式下表示除錯,生成的exe檔案中包含了除錯資訊的介面,r模式下是發行版exe程式,生成的exe檔案不包含除錯資訊,程式經過優化,效率高記憶體小;所以在移植到其他的電腦上使用時,優先考慮使用release模式生成.exe檔案;
編譯應用程式呼叫.lib靜態庫:
如上面所講,靜態庫的.lib檔案包含了鏈結庫的所有資訊(函式**和介面資訊)。所以我們在呼叫靜態庫.lib時,只需要包含頭檔案目錄(../include. .h),附加庫目錄,即可;
這樣,生成的應用程式.exe中將包含靜態庫.lib的資訊,這將導致生成的exe程式過大,不利用移植;
未完待續。。。
靜態庫Lib和動態庫Dll
1.概論 1.什麼是靜態連線庫,什麼是動態鏈結庫 靜態鏈結庫與動態鏈結庫都是共享 的方式,如果採用靜態鏈結庫,則無論你願不願意,lib 中的指令都全部被直接包含在最終生成的 exe 檔案中了。但是若使用 dll,該 dll 不必被包含在最終 exe 檔案中,exe 檔案執行時可以 動態 地引用和解除...
靜態庫Lib和動態庫Dll
1.概論 1.什麼是靜態連線庫,什麼是動態鏈結庫 靜態鏈結庫與動態鏈結庫都是共享 的方式,如果採用靜態鏈結庫,則無論你願不願意,lib 中的指令都全部被直接包含在最終生成的 exe 檔案中了。但是若使用 dll,該 dll 不必被包含在最終 exe 檔案中,exe 檔案執行時可以 動態 地引用和解除...
封裝動態庫dll和靜態庫lib(企業級應用例項)
結合彎管點雲提取流程 實踐動態庫封裝 pcl庫及相關過程配庫 屬性 常規 目標檔名 xttubedepart 64d debugx64 屬性 常規 目標檔名 xttubedepart 64 relea 64 1 建立xttubedepartplatform.h 2 命名規範 platform.h 平...