시스템 구축

시스템 구축

저는 현재 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 이것은 완전히 통제된 환경에서는 필요하지 않습니다.

관련 정보