web-dev-qa-db-ja.com

単一のVisual Studioソリューションを使用して、x86とx64の両方を同時にビルドするにはどうすればよいですか?

多くのプロジェクトファイルが含まれているx86 Visual Studioソリューションがあります。 DLLファイルの一部は、ユーザーのシステム上の他のアプリケーションへのプラグインとして機能するように設計されています。

DLLファイルの一部を64ビットアプリケーションをサポートできるように拡張しています。にヒットするようにソリューション/プロジェクトを設定したいと思います「ビルド」は、これらのDLLファイルのx86バージョンとx64バージョンの両方をビルドします。ソリューションには、C++プロジェクトとC#プロジェクトの両方が含まれます。

"バッチビルド"は両方をビルドできることを理解していますが、開発者が以前と同じボタンをクリックするだけで、すべての出力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):エラーMSB4006:ターゲット "ビルド"を含むターゲット依存関係グラフに循環依存関係があります。

私の条件は無限再帰を防ぐと思いますが、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 IDE内から無視されているようです。

最後に、最初のプロジェクトをインポートする別のプロジェクトを作成してみました。

<?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ブロックはないので、何が起こっているのかわかりません。

35
PeteVasi

。NET Compact Framework のコアアセンブリをビルドするのと同じようなことをします。

これを試して:

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

このような方法でプロジェクトをインポートすると、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の2つの構成が内部で定義されています。ご覧のとおり、TestProject64.vcxprojにはRelease | x64構成しかありません。 TestProject64.vcxprojで少なくとも1つの構成を定義する必要があります。そうしないと、Visual StudioがTestProject64.vcxprojをソリューションに追加できなくなります。

これで、TestProject.vcxprojとTestProject64.vcxprojの両方を同じソリューションに含めて、Release | x86Release | x64を同時にビルドできるようになりました。

6
bogser

C++の場合、ファイル/設定が頻繁に変更されないプロジェクトの場合、ソリューション内で2つのプロジェクトを作成し、両方のプロジェクトが同じソースファイルを参照するようにします。次に、x64ビルドで、64ビットと32ビットをビルドするように1つのプロジェクトを設定します。 (x86ビルドでは、1つを32ビットとして設定し、もう1つをオフにします。)

これをしばらく使用してきましたが、問題なく動作します。

もちろん、1つに加えた変更は、そのコピーにも加えられることに注意する必要があります。つまり、ファイルを追加/削除したり、ビルド設定を変更したりする場合は、2つの場所で行う必要があります。各ソースファイルのコピーはまだ1つしかないので、ソースコードの変更は1回だけ行う必要があります。

そしてもちろん、これを行うことは、IDEの使用から切り替えるよりも複雑/危険であると判断する場合があります。私たちのケースでは、それは本当にうまくいきました。

4
Leo Davidson

これを行う最善の方法は、コマンドラインからMSBuildを呼び出すことです。 MSBuildファイルを編集する必要はありません。とにかく走れ

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

開発者がVisual Studioを使用している場合、DLLファイルのみが生成されるため、それらをデバッグできるため、実際にデプロイしている場合は別のビルドプロセスがあると思いますDLLファイル。

4
the_mandrill

Visual StudioのUIでこれを行うことはできません。このためには、MSBuildファイルをハックする必要があります。

MSBuildの概要については、MSDNからこのリンクをお試しください

0
Pieter Breed

ダミーのC++ Makefileプロジェクトを作成し、それからMSBuildを2回呼び出すことをお勧めします。

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

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

おそらく私はこの議論の要点を逃した。

Visual Studioを使用して、メニューBuildConfiguration Managerに移動します。 アクティブソリューションプラットフォームドロップダウンで、[新規...]を選択すると、新しいソリューションプラットフォームダイアログが表示されます。 x64を選択し、デフォルトのコピー元を受け入れます。ダイアログと構成マネージャーを閉じます。

メニューを開きますBuildBatch Build。ビルドする構成を確認し、ビルドします。 Win32実行可能ファイルとは別のx64ビルド実行可能ファイルがあります。

実行可能ファイルを右クリックし、プロパティを選択して、互換性タブを選択することで、これらが意図したものであることを確認できます。ドロップダウンウィンドウで、実行可能ファイルを実行できるオペレーティングシステムを確認できます。

明らかに、すべての出力ファイルを適切な場所に配置するために行う必要のある他の微調整があるかもしれませんが、この方法は、上記のものよりもビルドをだますよりもいくらか単純に見えます。

0
Mike Pliam