2016-10-27 42 views
1

我看到有許多不同的理由隱式地和顯式地鏈接.DLL。我目前使用Visual Studio 2015和C++與SFML。這是隱式鏈接和顯式鏈接的DLL之間的最佳做法

隱含: - 好的一面: 您可以訪問.DLL頭(.h)並知道它包含的函數。 鏈接和使用更容易。 不太容易出錯。 似乎是最常用的做法。

單側: 絕對需要.lib,.h和.dll文件進行鏈接。 由於文件更多,請佔用更多的磁盤空間。

明確: - 好的一面: 由於只需要.dll,佔用較少的磁盤空間。

Bad side: 由於可能使用dll可能沒有的函數以及加載正確,因此可能會出錯。 沒有辦法知道dll包含的函數,因爲您沒有標題。

1:我聽說明確鏈接是一種不好的做法。它是否正確?

2:我應該主要關注隱式鏈接嗎? 3:顯然,我對DLL的知識很少,有沒有更多的好的和壞的一面,我沒有看到關於隱式和顯式的方式'鏈接一個DLL?

4:因爲我計劃製作遊戲,將精靈表放入dll中以便使用指針加載紋理是一種很好的做法嗎?

+0

你正在得到這個錯誤,確實是最好的嘗試。磁盤空間沒有區別,在這兩種情況下,您只需要部署DLL。在你的開發機器上顯式需求*更多*空間,你不能繞過需要聲明函數指針類型和代碼來挖掘出口。非常痛苦的代碼難以維護,特別是對於像SFML這樣的大型圖書館來說。您只使用顯式*,因爲該DLL可能沒有導出。從不需要SFML,因爲它是你複製DLL的。 –

回答

0

您可以刪除「佔用更少的磁盤空間」點。 * .lib只在開發人員的機器上需要。在安裝程序中,在這兩種情況下只需要DLL。

  1. 這取決於用例。有些情況下,顯式鏈接(通常稱爲動態加載)是唯一的方法,例如,當這些DLL實現用戶提供的插件時。

  2. 對於針對孩子的遊戲或其他桌面應用程序缺乏經驗的用戶的大量受衆,我建議不要使用DLL。靜態鏈接所有代碼。它不僅使你的應用變得更小(鏈接器會拋出你沒有調用的庫中的任何代碼),這也會消除一類錯誤。這當然也適用於C運行時庫(msvcrt.dll)。

_4。我不會那樣做。從邏輯上講,精靈表是數據,而不是代碼。無論靜態還是動態加載DLL,不應將其放在DLL中。相反,從文件加載數據。如果您在加載遊戲或關卡時只需要這些數據,請使用ReadFile API。如果您在遊戲運行過程中不斷從該精靈表讀取數據,則可以將該完整數據文件映射到進程的地址空間,請參閱CreateFileMapping和MapViewOfFile API(內部使用此方法的DLL加載)。只要注意32位應用程序的地址空間是稀缺的。

相關問題