2009-01-19 84 views
5

在VC++中選擇鏈接方法的最佳做法是什麼?任何東西/一切都可以靜態鏈接?靜態/動態運行時鏈接

在動態鏈接的項目上,鏈接庫的相對/絕對位置很重要?

有什麼優點和缺點?

加了:我主要是指lib文件。他們的行爲與dll鏈接相同嗎?

回答

5

動態鏈接允許您升級單個DLL而無需重新編譯應用程序。這就是爲什麼windows可以在沒有重新編譯應用程序的情況下升級的原因,因爲動態鏈接程序能夠確定dll中的入口點,前提是方法名稱存在。

靜態鏈接您的應用程序有一個好處,因爲對鏈接代碼的調用不會中斷,因此它們運行得更快。這可能會對性能相關的代碼產生影響。

使用DLL還可以幫助您減少內存佔用量,因爲您只需根據需要加載庫,並且可以在完成後卸載它們(請考慮應用程序插件,當您有圖像時只加載圖像瀏覽庫開放等)

編輯:羅伯特賭博添加了一條評論,我錯過了:DLLs被加載到操作系統中的所有進程共享的內存。這意味着如果兩個程序(或者程序的兩個實例)使用同一個DLL,他們將使用加載到內存中的相同的DLL,這將進一步減少您的整體內存使用量。

+1

+1,很好的答案。另外,在處理多個應用程序使用的庫時,如果使用動態庫,則不需要爲每個程序加載庫的完整副本,庫中的可執行代碼可以在所有使用它的程序之間共享,從而進一步減少內存用法。 – 2009-01-19 02:06:47

0

dll的一個明顯的優點是你可以升級單個組件,而不僅僅是整個應用程序(理論上)並共享公共組件(通過將它們封裝在dll中)。不幸的是,實際上dll(s)之間有一定的綁定(即使定義的很好)。這導致你需要在匹配的集合中升級dll,並隔離不能很好地運行在一起的dll。

如果不小心升級DLL,可能會導致稱爲DLL Hell的問題。

在現實生活中,應用程序傾向於將它們使用的所有dll與可執行文件放在同一目錄中。這允許升級但不會促進共享。升級包括升級應用程序目錄中的DLL集,使其與Windows中央存儲庫中的DLL同步。

1

的DLL 可以能使用於較小運行時的工作集,如果應用程序寫在這樣一種方式來管理上下文的DLL之間的切換(例如,對於較大的應用程序,你可以劃分應用功能集成到邏輯邊界是在自包含的DLL中實現並允許加載程序在運行時加載)。

雖然DLLs主要安裝/複製到.exe所在的文件夾中,但要求遵循加載程序加載規則(其中包括系統文件夾(壞主意),PATH,當前目錄[請參閱LoadLibrary有關優先級的完整描述的API幫助文檔])。

您「添加」了關於LIB文件的評論。在動態和靜態中,您使用LIB文件進行鏈接。但是在動態加載的情況下,您可以將.exe和所有依賴的DLL(LIB文件包含相應DLL的導出入口點)一起傳遞。

我更喜歡DLL,因爲我的應用程序往往更大和更細化,這使我只能提供這些更新的組件(DLL)。我們甚至將業務邏輯從他們自己的DLL中分離出來[允許獨立於邏輯的資源專用dll的本地化。

使用DLL進行編程是否會導致您強制自己遵守導出的類/方法或函數的契約。

+0

動態鏈接庫可以用於導出庫。請參閱LoadLibrary()/ LoadLibraryEx()。 – 2009-01-19 21:11:13