靜態(tài)鏈接庫
- 在編譯時(shí)將庫的代碼(
.lib文件
)和應(yīng)用程序的代碼合并在一起,生成一個(gè)單獨(dú)的可執(zhí)行文件。 - 發(fā)布時(shí)非常方便,直接一個(gè).exe文件即可
動(dòng)態(tài)鏈接庫(共享庫)
- 庫的代碼在編譯時(shí)和鏈接時(shí)與應(yīng)用程序分開。應(yīng)用程序包含對庫的引用(
.lib文件
,在這里被稱為導(dǎo)入庫),但不包含庫的實(shí)際代碼。 - 在運(yùn)行時(shí),操作系統(tǒng)加載共享庫(
dll
),并將其與應(yīng)用程序連接。
在對你的項(xiàng)目進(jìn)行依賴設(shè)置時(shí)就會發(fā)現(xiàn),鏈接靜態(tài)庫和動(dòng)態(tài)庫的步驟是基本一致的,比如用Premake工具維護(hù)的項(xiàng)目中,在premake.lua
文件中,通過links{myStaticLibrary, mySharedLibrary }
來鏈接庫;比如Cmake維護(hù)的項(xiàng)目中,通過target_link_libraries(MyProject PRIVATE LibraryName)
來鏈接庫,并沒有區(qū)分是靜態(tài)還是動(dòng)態(tài),編譯器一般會自己判斷。額外的,如果是動(dòng)態(tài)庫,還需要把.dll文件放在可執(zhí)行文件的目錄下。
鏈接一個(gè)共享庫和靜態(tài)庫都是link一個(gè).lib
文件,區(qū)別是,鏈接共享庫時(shí)這個(gè).lib
是作為一個(gè)導(dǎo)入庫來使用,這個(gè) .lib
文件包含了鏈接器在編譯時(shí)所需的符號信息(類似于頭文件的概念,只包含聲明,但沒有實(shí)現(xiàn)),這使得編譯器能夠在編譯階段正確引用 dll 中的函數(shù)和數(shù)據(jù)(dll存放的才是真正的可執(zhí)行代碼)。
總結(jié)一下,一個(gè)動(dòng)態(tài)庫的鏈接:
- 編譯時(shí)鏈接(Compile-Time Linking): 通過 .lib 文件,在編譯階段將項(xiàng)目與 DLL 相關(guān)聯(lián),以獲取符號信息。
- 運(yùn)行時(shí)加載(Run-Time Loading): 在程序運(yùn)行時(shí)動(dòng)態(tài)加載 DLL 文件,獲取其中的實(shí)際代碼和數(shù)據(jù)。
選擇靜態(tài)鏈接還是動(dòng)態(tài)鏈接取決于應(yīng)用程序的需求和設(shè)計(jì)考慮。靜態(tài)鏈接適用于獨(dú)立分發(fā),而動(dòng)態(tài)鏈接則有助于節(jié)省系統(tǒng)資源和更新庫代碼。
大多數(shù)游戲引擎通常會使用動(dòng)態(tài)鏈接庫(DLL)的方式進(jìn)行鏈接。有幾個(gè)優(yōu)點(diǎn):
-
節(jié)省內(nèi)存空間: 游戲引擎通常具有大量共享的功能和資源,如圖形渲染、物理模擬、聲音處理等。通過動(dòng)態(tài)鏈接,多個(gè)游戲?qū)嵗梢怨蚕硐嗤囊娌糠?,減少內(nèi)存占用。
-
靈活更新: 如果游戲引擎的某個(gè)模塊需要更新,你只需要替換相應(yīng)的動(dòng)態(tài)鏈接庫文件,而不必重新構(gòu)建整個(gè)游戲。這有助于減少發(fā)布更新所需的時(shí)間。
-
插件支持: 動(dòng)態(tài)鏈接庫的模塊化特性使得游戲引擎可以更容易地支持插件。新的功能可以通過添加新的動(dòng)態(tài)鏈接庫來擴(kuò)展游戲引擎,而無需修改已有的代碼。
-
維護(hù)性: 游戲引擎的不同部分可以獨(dú)立開發(fā)和維護(hù),因?yàn)樗鼈兌伎梢宰鳛楠?dú)立的動(dòng)態(tài)鏈接庫。這有助于團(tuán)隊(duì)合作和代碼維護(hù)。、
庫存在的最大的意義就是為了將一組相關(guān)的代碼(比如多個(gè)cpp文件,定義了非常多的函數(shù)、類等等)打包成一個(gè)單一的單元,以便在其他項(xiàng)目或者同一項(xiàng)目的不同部分中共享和重用。文章來源:http://www.zghlxwxcb.cn/news/detail-679509.html
比如你是想編譯100個(gè)cpp ,還是直接鏈接一個(gè).lib 或 .dll 明顯后者方便文章來源地址http://www.zghlxwxcb.cn/news/detail-679509.html
到了這里,關(guān)于靜態(tài)鏈接庫和動(dòng)態(tài)鏈接庫的區(qū)別的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!