Подтвердить что ты не робот

Используйте одно решение Visual Studio для одновременного создания как x86, так и x64?

У меня есть решение x86 Visual Studio со многими файлами проекта. Некоторые из DLL разработаны для работы в качестве плагинов для других приложений в пользовательской системе. Мы расширяем некоторые библиотеки DLL, чтобы поддерживать 64-разрядные приложения. То, что я хотел бы сделать, - это настроить решение/проекты, чтобы просто нажимать "Build" будет строить как x86, так и x64 версии этих DLL. Решение содержит проекты С++ и С#. Я понимаю, что "Batch Build" способна создавать оба, хотя было бы более удобно, если бы разработчики могли просто нажать ту же кнопку, что и раньше, и создать все выходные DLL файлы.

Вот несколько модификаций, которые я пробовал в тестовом проекте, но не приступили к работе:

Я попытался изменить <Target Name="AfterBuild">, чтобы попробовать:

<Target Name="AfterBuild" Condition=" '$(Platform)' == 'x86' ">
  <PropertyGroup>
    <Platform>x64</Platform>
    <PlatformTarget>x64</PlatformTarget>
  </PropertyGroup>
  <CallTarget Targets="Build"/>
</Target>

но это приводит к следующей ошибке:

C:\Windows\Microsoft.NET\Framework\v3.5\Microsoft.Common.targets(565,5): error MSB4006: There is a circular dependency in the target dependency graph involving target "Build".

Я думаю, что мои условия будут препятствовать бесконечной рекурсии, но я понимаю, как MSBuild не мог этого видеть.

Я также пробовал:

<Project DefaultTargets="MyBuild86;MyBuild64" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
...
<Target Name="MyBuild86">
  <PropertyGroup>
    <Platform>x86</Platform>
    <PlatformTarget>x86</PlatformTarget>
  </PropertyGroup>
  <CallTarget Targets="Build"/>
</Target>
<Target Name="MyBuild64">
  <PropertyGroup>
    <Platform>x64</Platform>
    <PlatformTarget>x64</PlatformTarget>
  </PropertyGroup>
  <CallTarget Targets="Build"/>
</Target>

но мой DefaultTargets, как представляется, игнорируется внутри среды Visual Studio.

Наконец, я попытался создать отдельный проект, который импортирует первый проект:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform>x64</Platform>
    <PlatformTarget>x64</PlatformTarget>
    <ProductVersion>9.0.30729</ProductVersion>
    <SchemaVersion>2.0</SchemaVersion>
    <OutputPath>..\$(Configuration)\x64\</OutputPath>
    <ProjectGuid>{A885CAC3-2BBE-4808-B470-5B8D482CFF0A}</ProjectGuid>
  </PropertyGroup>
  <Import Project="BuildTest.csproj" />
</Project>

и это пока показало, что обещает. Однако Visual Studio, похоже, игнорирует мой параметр OutputPath из этого нового проекта и вместо этого выводит exe/dll на путь, указанный в исходном проекте. Там нет блока PropertyGroup, который я вижу, который выполняется в исходном проекте, чтобы переопределить это, поэтому я не уверен, что происходит.

4b9b3361

Ответ 1

Мы делаем что-то похожее на сборку основных сборок для .NET CF. Попробуйте следующее:

<Target Name="AfterBuild">
    <MSBuild Condition=" '$(Platform)' == 'x86' " Projects="$(MSBuildProjectFile)" Properties="Platform=x64;PlatFormTarget=x64" RunEachTargetSeparately="true" />
</Target>

Ответ 2

Я думаю, что лучший способ сделать это - вызвать msbuild из командной строки. Он не нуждается в редактировании файлов msbuild, просто запустите

msbuild myproj.sln /p:Configuration="Debug|Win32"
msbuild myproj.sln /p:Configuration="Debug|x64"

Я предполагаю, что если разработчик использует Visual Studio, тогда они будут генерировать только DLL, чтобы они могли отлаживать их, и что у вас есть отдельный процесс сборки, если вы действительно развертываете DLL?

Ответ 3

Для С++, и если это проект, чьи файлы/настройки не меняются часто, один из способов сделать это - создать два проекта в рамках решения, причем оба проекта относятся к тем же исходным файлам. Затем в сборках x64 установите один проект для сборки 64-разрядных и других 32-разрядных. (В строках x86 установите один из 32-разрядных и отключите другой.)

Мы использовали это некоторое время, и он отлично работает.

Конечно, вы должны быть осторожны, чтобы любые изменения, внесенные вами в один, также были внесены в его копию. Если вы добавите/удалите файл или измените его настройку сборки, вы должны сделать это в двух местах. Изменения исходного кода все еще нужно выполнять только один раз, потому что все еще есть только одна копия каждого исходного файла.

И, конечно же, вы можете решить, что делать это сложнее/рискованнее, чем отказаться от использования IDE. В нашем случае это работало очень хорошо, однако.

Ответ 4

Импорт проекта таким образом работает для меня в Visual Studio 2010:

TestProject64.vcxproj

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="TestProject.vcxproj" />
  <ItemGroup Label="ProjectConfigurations">
    <ProjectConfiguration Include="Release|x64">
      <Configuration>Release</Configuration>
      <Platform>x64</Platform>
    </ProjectConfiguration>
  </ItemGroup>
  <PropertyGroup Label="Globals">
    <ProjectGuid>{B7D61F1C-B413-4768-8BDB-31FD464AD053}</ProjectGuid>
  </PropertyGroup>
</Project>

TestProject64.vcxproj.filters

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="TestProject.vcxproj.filters" />
</Project>

TestProject.vcxproj имеет две конфигурации, определенные внутри: Release | x86 и Release | x64. Как вы можете видеть, TestProject64.vcxproj имеет только конфигурацию Release | x64. Необходимо определить хотя бы одну конфигурацию в TestProject64.vcxproj, иначе Visual Studio не сможет добавить TestProject64.vcxproj к решению.

Теперь можно включить оба теста TestProject.vcxproj и TestProject64.vcxproj в одно и то же решение и одновременно создать Release | x86 и Release | x64.

Ответ 6

Возможно, я пропустил эту дискуссию. Используя Visual Studio, перейдите в Менеджер сборки/конфигурации. В раскрывающемся списке "Активная платформа решений" выберите "новое...", появится диалоговое окно "Новая платформа решений". Выберите x64 и примите копию по умолчанию. Закройте диалоговое окно и диспетчер конфигурации. Теперь откройте сборку/пакетную сборку. Проверьте те конфигурации, которые вы хотите построить и построить. Вы найдете исполняемые файлы для сборки x64 отдельно от исполняемых файлов Win32. Вы можете убедиться, что это то, что было предназначено, щелкнув правой кнопкой мыши на exec и выбрав "Свойства", выберите вкладку "Совместимость". В раскрывающемся окне вы можете проверить, в каких операционных системах может быть запущен exec. Очевидно, что может потребоваться некоторая другая настройка, чтобы получить все выходные файлы в соответствующих местах, но этот метод кажется несколько более простым, чем обманывать с помощью сборки, чем описанные выше.

Ответ 7

Я бы предложил создать макет проекта С++ Makefile и затем дважды вызывать MSBuild:

msbuild myproj.sln /p:Configuration="Debug|Win32" 

msbuild myproj.sln /p:Configuration="Debug|x64"

Ответ 8

Я столкнулся с этой проблемой с проектом, запущенным в VS2008 XP (32-разрядная версия), а также VS2010 7 (64-разрядная версия). Решением, которое я использовал, было использование переменной $(PROGRAMFILES). Он правильно разрешен на обеих машинах.