複数バージョンのVisualStudioを共存させる

Visual Studio 2013が既にリリースされていますが,複数バージョンのVisual Studioを共存させる方法のメモ.といってもVC++の話です.

C++開発では,インクルードディレクトリやライブラリディレクトリをプロジェクト毎に個別に指定することができますが,グローバルに設定することもできます.

プロパティマネージャのMicrosoft.Cpp.Win32.userがそれにあたります. (プロパティマネージャは表示(VIEW)→ほかのウィンドウ(Other Windows)から表示可能です.)

cppwin32

これのファイルの実体は,以下のパスにあるプロパティシートです.

C:\Users\<user-name>\Local\AppData\Microsoft\MSBuild\v4.0\Microsoft.Cpp.Win32.user.props

VS2010,VS2012,VS2013でMSBuildのバージョンは変わってないので,このファイルはこれらのバージョンのVisual Studioで共有されています.したがって,Visual Studioの各バージョンで個別のグローバル設定をすることが簡単にはできません

解決方法

これを解決するには,Microsoft.Cpp.Win32.user.propsを直接書き換えます.ポイントは,この件と同様にCondistion属性を使うことができる,ということです.

例えば,VS2010とVS2012で個別に設定をするなら以下のような記述になります.

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemDefinitionGroup>
    <ClCompile Condition=" '$(VisualStudioVersion)' == '10.0'">
      <AdditionalIncludeDirectories>C:\development10\include;C:\development10\include\boost-1_50_0;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
    </ClCompile>
    <Link Condition=" '$(VisualStudioVersion)' == '10.0'">
      <AdditionalLibraryDirectories>C:\development10\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
    </Link>
    <ClCompile Condition=" '$(VisualStudioVersion)' == '11.0'">
      <AdditionalIncludeDirectories>C:\development12\include;C:\development12\include\boost-1_54;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
    </ClCompile>
    <Link Condition=" '$(VisualStudioVersion)' == '11.0'">
      <AdditionalLibraryDirectories>C:\development12\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
    </Link>
  </ItemDefinitionGroup>
</Project>

上の例では,VS2010,VS2012でインクルードディレクトリ,ライブラリディレクトリを切り替えています.

このためにCondision属性で$(VisualStudioVersion)をテストしています.10.0ならVS2010,VS2012なら11.0となります.

(ItemDefinitionGroup要素にもCondition属性を設定できる,かもしれません.未確認.)

2014-01-07 追記

ItemDefinitionGroup要素にもCondition属性を設定できるようですね.

ItemDefinitionGroup 要素 (MSBuild):

以下のようにした方が簡潔ですね.

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemDefinitionGroup Condition=" '$(VisualStudioVersion)' == '10.0'">
    <ClCompile>
      <AdditionalIncludeDirectories>C:\development10\include;C:\development10\include\boost-1_50_0;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
    </ClCompile>
    <Link>
      <AdditionalLibraryDirectories>C:\development10\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
    </Link>
  </ItemDefinitionGroup>
  <ItemDefinitionGroup Condition=" '$(VisualStudioVersion)' == '11.0'">
    <ClCompile>
      <AdditionalIncludeDirectories>C:\development12\include;C:\development12\include\boost-1_54;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
    </ClCompile>
    <Link>
      <AdditionalLibraryDirectories>C:\development12\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
    </Link>
  </ItemDefinitionGroup>
</Project>

ちなみに$(VisualStudioVersion)はVS2013では12.0となるようです.

Leave a Reply