저는 현재 Visual Studio 2015에서 OpenGL 애플리케이션을 만들고 있으며 GLFW, GLEW 등에 대한 모든 항목을 성공적으로 연결하고 포함했습니다.
그러나 애플리케이션을 실행할 때 을 포함해야 하는데 glew32.dll
전혀 문제가 없습니다. 그냥 가서 x64 dll을 가져와서 프로젝트 폴더에 추가합니다. 그러나 이제 32비트 모드에서 프로그램을 실행하면 프로그램이 중단되고, 64비트 프로그램에서 32비트 dll을 사용하면 그 반대도 마찬가지입니다. 이에 대한 유일한 저렴한 수정 방법은 아키텍처별 dll을 빌드 폴더에 포함하는 것입니다.
결과 프로그램을 다음과 같은 형식으로 저장하고 싶기 때문에 아키텍처별로 dll을 포함할 수 있는 방법이 있습니까?
프로그램 디렉토리
- 게임.exe
- game_x64.exe
- x64(폴더)
- glew32.dll
- x32(폴더)
- glew32.dll
glew32.dll
이와 같은 일이 가능하지 않다면 대신 하나의 폴더에 and 를 보관 하게 되어 매우 기쁩니다 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 사전 로딩
올바른 DLL을 수동으로 호출 LoadLibrary
하거나 로드합니다. LoadLibraryEx
이는 OS 로더가 DLL을 자동으로 로드하기 전에 제어할 수 있는 경우에만 가능합니다.
별도의 디렉토리
최상위 디렉토리에 런처를 넣으세요. 그런 다음 x86 및 x64 빌드를 별도의 디렉터리에 넣습니다.
.\Launcher.exe
.\x64\Game.exe
.\x64\glew32.dll
.\x86\Game.exe
.\x86\glew32.dll
검색 경로
IMHO 이것은 완전히 통제된 환경에서는 필요하지 않습니다.