現在、Visual Studio 2015 で OpenGL アプリケーションを作成しており、GLFW、GLEW などのすべてのものを正常にリンクして組み込むことができました。
ただし、アプリケーションを実行するときは、 を含める必要がありますがglew32.dll
、まったく問題ありません。x64 dll を取得してプロジェクト フォルダーに追加するだけです。ただし、プログラムを 32 ビット モードで実行すると、プログラムが壊れます。また、32 ビット dll を 64 ビット プログラムで使用すると、その逆になります。この問題を安価に解決するには、アーキテクチャ固有の dll をビルド フォルダーに含めるしかありません。
次のような形式で結果のプログラムを格納したいので、アーキテクチャ固有の基準で dll を組み込む方法はありますか?
プログラムディレクトリ
- ゲーム.exe
- ゲーム_x64.exe
- x64 (フォルダー)
- glew32.dll
- x32 (フォルダー)
- glew32.dll
このようなことが不可能な場合は、代わりに と を 1 つのフォルダーに格納できれば非常にうれしいのです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 が OS ローダーによって自動的にロードされる前に制御権を持っている場合にのみ可能です。
別々のディレクトリ
ランチャーを最上位ディレクトリに配置します。次に、x86 ビルドと x64 ビルドを別々のディレクトリに配置します。
.\Launcher.exe
.\x64\Game.exe
.\x64\glew32.dll
.\x86\Game.exe
.\x86\glew32.dll
検索パス
私の意見では、完全に制御された環境では、これは決して必要ないはずです。