Visual Studio プロジェクトでのプロパティの継承

Visual Studio のネイティブ プロジェクト システムは、MSBuild に基づいています。 MSBuild では、あらゆる種類のプロジェクトをビルドするためのファイル形式と規則が定義されています。 これは複数の構成とプラットフォームについての複雑な構築の大部分を管理します。 このしくみを理解しておくと役立ちます。 これは特にカスタム構成を定義する場合に重要です。 または、共有して複数のプロジェクトにインポートできる、再利用可能なプロパティのセットを作成する場合も当てはまります。

.vcxproj ファイル、.props ファイル、および .targets ファイル

プロジェクトのプロパティは、いくつかのファイルに格納されます。 一部は、 .vcxproj プロジェクト ファイルに直接格納されます。 その他は、プロジェクト ファイルによってインポートされ、既定値を提供する .targets ファイル、または .props ファイルから取得されます。 Visual Studio 2015 プロジェクト ファイルは、基本ディレクトリ ( %ProgramFiles(x86)%\MSBuild\Microsoft.Cpp\v4.0\v140 ) のロケール固有のフォルダーにあります。

プロジェクトのプロパティは、いくつかのファイルに格納されます。 一部は、 .vcxproj プロジェクト ファイルに直接格納されます。 その他は、プロジェクト ファイルによってインポートされ、既定値を提供する .targets ファイル、または .props ファイルから取得されます。 Visual Studio 2017 プロジェクト ファイルは、基本ディレクトリ ( %VSINSTALLDIR%Common7\IDE\VC\VCTargets\ ) のロケール固有のフォルダーにあります。

プロジェクトのプロパティは、いくつかのファイルに格納されます。 一部は、 .vcxproj プロジェクト ファイルに直接格納されます。 その他は、プロジェクト ファイルによってインポートされ、既定値を提供する .targets ファイル、または .props ファイルから取得されます。 Visual Studio プロジェクト ファイルは、基本ディレクトリ ( %VSINSTALLDIR%MSBuild\Microsoft\VC\<version> ) のロケール固有のフォルダーにあります。 <version> は、Visual Studio のバージョンに固有のものです。 Visual Studio 2019 の場合は v160 です。

プロパティは、独自のプロジェクトに追加されているすべてのカスタム .props ファイルにも格納されます。 これらのファイルは、手動で編集 "しない" ことを強くお勧めします。 MSBuild や .vcxproj ファイルを初めてお使いになる場合は、代わりに、すべてのプロパティ (特に継承に関与するもの) を変更する場合は、IDE のプロパティ ページをご使用ください。

前に示したように、同じ構成の同じプロパティに対し、これらの異なるファイルで異なる値を割り当てることができます。 プロジェクトをビルドするときに、プロジェクト ファイルとすべてのインポートされたファイルが、後述の適切に定義された順序で、MSBuild エンジンによって評価されます。 各ファイルが評価されると、そのファイルで定義されているすべてのプロパティ値が、既存の値をオーバーライドします。 指定されていない値は、前に評価されたファイルから継承されます。 プロパティ ページでプロパティを設定するときは、それを設定する場所にも注意を払うことが重要です。 あるプロパティを .props ファイルで "X" に設定しても、プロジェクト ファイルでそのプロパティが "Y" に設定されている場合、プロジェクトは "Y" に設定されたプロパティでビルドされます。 同じプロパティが .cpp ファイルなどのプロジェクト項目で "Z" に設定されている場合、MSBuild エンジンは値 "Z" を使います。

基本的な継承ツリーを次に示します。

  1. MSBuild CPP ツールセットの既定の設定 (基本ディレクトリの Microsoft.Cpp.Default.props ファイル。 .vcxproj ファイルによってインポートされます)。

  2. プロパティ シート

  3. .vcxproj ファイル。 (このファイルを使用すると、既定値とプロパティ シートの設定をオーバーライドできます。)

  4. 項目メタデータ

ヒント

プロパティ ページで、太字のプロパティは、現在のコンテキストで定義されます。 通常フォントのプロパティが継承されます。

インポートされたすべての値を含む展開されたプロジェクト ファイルを表示する

指定したプロパティ値がどのように継承されているかを特定するために、拡張されたファイルを表示すると便利な場合があります。 拡張されたバージョンを表示するには、Visual Studio コマンド プロンプトで次のコマンドを入力します (プレースホルダー ファイル名を適宜変更してください)。

msbuild /pp:temp.txtmyapp.vcxproj

拡張されたプロジェクト ファイルは大きく、MSBuild に詳しくない場合は理解するのが難しい可能性があります。 プロジェクト ファイルの基本的な構造を次に示します。

  1. IDE では公開されていない基本的なプロジェクトのプロパティ。

  2. ツールセットに依存しない一部の基本的なプロパティを定義する Microsoft.cpp.default.props のインポート。

  3. グローバル構成プロパティ ( [Configuration General](構成概要) ページの [PlatformToolset] および [プロジェクト] 既定プロパティとして公開されます)。 これらのプロパティは、次の手順の Microsoft.cpp.props でインポートされるツールセットおよび組み込みプロパティ シートを決定します。

  4. プロジェクトのほとんどの既定値を設定する Microsoft.cpp.props のインポート。

  5. .user ファイルを含むすべてのプロパティ シートのインポート。 これらのプロパティ シートは、 [PlatformToolset] および [プロジェクト] の既定プロパティを除くすべてをオーバーライドできます。

  6. プロジェクト構成プロパティの残り。 これらの値は、プロパティ シートの設定をオーバーライドできます。

  7. 項目 (ファイル) とそのメタデータ。 これらの項目は、他のプロパティやインポートの前に発生した場合でも、常に MSBuild 評価規則の最後の単語です。

詳細については、「MSBuild プロパティ」を参照してください。

ビルドの構成

構成は、名前が与えられたプロパティの任意のグループでしかありません。 Visual Studio はデバッグとリリースの構成を提供します。 これらはそれぞれ、デバッグ ビルドまたはリリース ビルドのさまざまなプロパティを適切に設定します。 構成マネージャーを使用して、カスタム プロパティを定義できます。 これらは、特定のビルドのフレーバーに対してプロパティをグループ化するための便利な方法です。

ビルド構成について理解を深めるには、プロパティ マネージャーを開きます。 これは、お使いの設定に応じて、[ビュー] > [プロパティ マネージャー] または [ビュー] > [その他のウィンドウ] > [プロパティ マネージャー] を選択して開くことができます。 プロパティ マネージャーには、プロジェクトの構成とプラットフォームのペアごとにノードがあります。 これらの各ノードの下には、その構成に固有のプロパティを設定するプロパティ シート ( .props ファイル) のノードがあります。

Screenshot of the Property Manager window.

たとえば、[プロパティ ページ] の [General](全般) ペインに進むことができます。 [文字セット] プロパティを "Unicode を使用する" ではなく "未設定" に変更し、 [OK] をクリックします。 プロパティ マネージャーには [Unicode のサポート] プロパティ シートが表示されなくなります。 現在の構成では削除されていますが、他の構成ではまだ存在しています。

プロパティ マネージャーおよびプロパティ シートの詳細については、Visual Studio C++ プロジェクト設定の共有または再利用に関するページを参照してください。

ヒント

.user ファイルは古い機能です。 構成およびプラットフォームに従ってプロパティが正しくグループ化されるように、これを削除することをお勧めします。