読者です 読者をやめる 読者になる 読者になる

空飛ぶ気まぐれ雑記帳

主に趣味とかプログラミングについて扱います。

古き悪しき全プロジェクト共通のVC++ディレクトリ的なSomethingを設定する方法

むか~し、むかし。Visual Studio 2008では設定>プロジェクトとソリューションからVC++ディレクトリの設定を行うことが出来た。
この設定では、全てのプロジェクトに共通した設定を書き込むことが出来、大変重宝しておった。
その一方で、色々な問題からVisual Studio 2010の頃には廃止された。

それ以来、プロジェクトに個別で設定するか、ユーザープロパティシートに書き込んで無理矢理に再現するかの2択になっている。
それで、先日Visual Studio 2017にアップデートした際に、再設定する必要があったので、書くネタにも困っていたところだし、メモとして残しておく。

ユーザプロパティシートは"%USERPROFILE%\Local\Microsoft\MSBuild\v4.0"にあるので、自分の環境に合わせて、Win32(x86)、Win64(x64)を編集する。
なお、今回紹介する設定方法はx86、x64共用なので、どちらでも同じ内容を書けば良い。

以下は実際の設定内容。

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ImportGroup Label="PropertySheets">
  </ImportGroup>
  <PropertyGroup Label="UserMacros" />
  <ItemDefinitionGroup />
  <ItemGroup />
  <PropertyGroup>
    <!--プラットフォーム名。x86かx64か-->
    <ShortPlatform Condition="'$(Platform)' == 'Win32'">x86</ShortPlatform>
    <ShortPlatform Condition="'$(Platform)' != 'Win32'">x64</ShortPlatform>
    <!--ツールセット名。v141がVisual Studio 2017-->
    <Toolset Condition="'$(PlatformToolset)' == 'v120'">vc12</Toolset>
    <Toolset Condition="'$(PlatformToolset)' == 'v140'">vc14</Toolset>
    <Toolset Condition="'$(PlatformToolset)' == 'v141'">vc14</Toolset>
  </PropertyGroup>
  <Choose>
    <When Condition="'$(PlatformToolset)' == 'v120' ">
      <PropertyGroup>
        <LibraryPath>D:\library\lib;$(LibraryPath)</LibraryPath>
        <IncludePath>D:\library\include;$(IncludePath)</IncludePath>
      </PropertyGroup>
    </When>
    <When Condition="'$(PlatformToolset)' == 'v140' AND '$(Platform)' == 'Win32'">
      <PropertyGroup>
        <LibraryPath>D:\vs14library\lib;D:\vs14library\$(ShortPlatform)\$(Toolset)\lib;D:\vs14library\lib\vc_lib;$(LibraryPath)</LibraryPath>
        <IncludePath>D:\vs14library\include;$(IncludePath)</IncludePath>
      </PropertyGroup>
    </When>
    <When Condition="'$(PlatformToolset)' == 'v140' AND '$(Platform)' != 'Win32'">
      <PropertyGroup>
        <LibraryPath>D:\vs14library\lib;D:\vs14library\$(ShortPlatform)\$(Toolset)\lib;D:\vs14library\lib\vc_x64_lib;$(LibraryPath)</LibraryPath>
        <IncludePath>D:\vs14library\include;$(IncludePath)</IncludePath>
      </PropertyGroup>
    </When>
    <When Condition="'$(PlatformToolset)' == 'v141' AND '$(Platform)' == 'Win32'">
      <PropertyGroup>
        <LibraryPath>D:\vs14library\lib;D:\vs14library\$(ShortPlatform)\$(Toolset)\lib;D:\vs14library\lib\vc_lib;$(LibraryPath)</LibraryPath>
        <IncludePath>D:\vs14library\include;$(IncludePath)</IncludePath>
      </PropertyGroup>
    </When>
    <When Condition="'$(PlatformToolset)' == 'v141' AND '$(Platform)' != 'Win32'">
      <PropertyGroup>
        <LibraryPath>D:\vs14library\lib;D:\vs14library\$(ShortPlatform)\$(Toolset)\lib;D:\vs14library\lib\vc_x64_lib;$(LibraryPath)</LibraryPath>
        <IncludePath>D:\vs14library\include;$(IncludePath)</IncludePath>
      </PropertyGroup>
    </When>
  </Choose>
</Project>

以上なのでが、この設定ファイル、記述内容から何となくお察しかもしれないが、Visual Studio 2012の頃から使いまわしている。
そのため、中々にカオスなことになっているが悪しからず。

一応各部の解説をすると、Chooseタグが所謂if文にあたるタグで、WhenタグのCondition属性に式を設定する。このときif文内で使える変数はPropertyGroup内で宣言?した変数のみとなっている。
また、というのがライブラリのディレクトリで、*.libファイルが保存されているディレクトリを足せば良い。同様に、にはヘッダファイルのディレクトリを設定すれば良い。
つまるところ"D:\vs14library"とか"D:\library"とかなってる部分を自分の環境に合わせて変えれば良い。また、私の環境の場合、cmakeを使ってインストールしたライブラリをすべて1つのディレクトリに集約しているので1つないし、2、3個しかパスを足していないが、各ライブラリを別個のディレクトリにインストールしている場合、各ディレクトリを設定する必要がある。

ぶっちゃけ、Microsoftが公開している情報にたどり着けた試しがないせいか、実に5年間この説明があっているのかすらよくわからない。ただ、動いているという事実だけはあるので、まあいいかと捨て置いているので、誰か詳しい人いたらコメントください。