我目前正在 Visual Studio 2015 中製作 OpenGL 應用程序,並已成功連結並包含 GLFW、GLEW 等的所有內容。
但是,當我運行我的應用程式時,我需要包含glew32.dll
,一點問題都沒有。我只是去獲取 x64 dll 並將其添加到專案資料夾中。但現在,當我在 32 位元模式下運行程式時,它會崩潰,如果我要在 64 位元程式上使用 32 位元 dll,則反之亦然。對此唯一廉價的修復方法是將特定於體系結構的 dll 包含到建置資料夾中。
有沒有辦法可以在特定於體系結構的基礎上包含 dll,因為我想以以下形式容納生成的程式:
程式目錄
- 遊戲.exe
- 遊戲_x64.exe
- x64(資料夾)
- glew32.dll
- x32(資料夾)
- glew32.dll
如果這樣的事情不可能,我非常樂意將glew32.dll
和glew32_x64.dll
放在一個資料夾中,但這可能永遠不會發生,因為庫不尋找新的 dll ...
答案1
文章關於動態連結庫搜尋順序實際上還有一些關於如何更改應用程式查找 DLL 的方式的內容。也就是說它引用的是SetDllDirectory
和LoadLibraryEx
甚至更多。
答案2
有多種方法可以解決該問題。
建構系統
MSBuild 具有許多無法透過 Visual Studio GUI 控制的功能。您幾乎可以在任何地方使用變量,有時也可以使用條件。
您可以在.vcxproj
檔案(只是 XML)中聲明條件區塊,像這樣:
<Choose>
<When Condition="'$(Platform)' == 'Win32'">
<ItemGroup>
<Reference Include="SomeProject">
<HintPath>..\Libraries\x86\SomeProject.dll</HintPath>
</Reference>
</ItemGroup>
</When>
<Otherwise>
<ItemGroup>
<Reference Include="SomeProject">
<HintPath>..\Libraries\x64\SomeProject.dll</HintPath>
</Reference>
</ItemGroup>
</Otherwise>
</Choose>
還有其他解決方案,例如這個:
<Content Include="..\..\MyContentFiles\**\*.*">
<Link>%(RecursiveDir)%(Filename)%(Extension)</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
它並不能直接解決您的問題,但可以讓您更深入地了解 MSBuild 的功能。
我曾經有一個針對非常相似問題的有效解決方案(透過調試/發布版本引用.NET 中的本機庫),但它仍然保留在我以前的雇主那裡。
如果您覺得 MSBuild 限制太多,您可以隨時建立建置後任務。
該解決方案也可以成為下面提到的雙架構單獨目錄解決方案的一部分,因為它有助於更好地自動化建置流程。
DLL預載
手動調用LoadLibrary
或LoadLibraryEx
併載入正確的 DLL。只有當您在作業系統載入程式自動載入 DLL 之前擁有控制權時,才有可能實現這一點。
單獨的目錄
將啟動器放在頂級目錄中。然後,將 x86 和 x64 版本放入單獨的目錄中:
.\Launcher.exe
.\x64\Game.exe
.\x64\glew32.dll
.\x86\Game.exe
.\x86\glew32.dll
搜尋路徑
恕我直言,這在完全受控的環境中是不必要的。