В настоящее время я создаю приложение OpenGL в Visual Studio 2015 и успешно связал и включил все свои вещи для GLFW, GLEW и т. д.
Однако, когда я запускаю свое приложение, мне нужно включить glew32.dll
, никаких проблем. Я просто беру x64 dll и добавляю ее в папку проекта. Однако теперь, когда я запускаю свою программу в 32-битном режиме, она ломается, и наоборот, если я использую 32-битную dll в 64-битной программе. Единственное дешевое решение этой проблемы — включить специфичные для архитектуры dll в папки сборки.
Есть ли способ включить библиотеки DLL в зависимости от архитектуры, поскольку я хочу разместить свою итоговую программу в такой форме:
Каталог программ
- игра.exe
- game_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
Путь поиска
По моему скромному мнению, в полностью контролируемой среде это никогда не понадобится.