.vcxproj ファイルとワイルドカード

IDE Visual Studio、ファイル内のプロジェクト項目内の特定のコンストラクトはサポート .vcxproj されていません。 これらのサポートされていないコンストラクトには、ワイルドカード、セミコロンで区切られたリスト、または複数のファイルに展開MSBuildマクロが含まれます。 .vcxprojC++ ビルドのプロジェクト システムは、C++ ビルドよりも制限MSBuild。 各プロジェクト 項目には、独自のプロジェクト 項目MSBuildがあります。 ファイル形式の詳細については、 .vcxproj および ファイル構造 に関.vcxproj

これらのコンストラクトの例は、IDE ではサポートされていません。

<ItemGroup>
  <None Include="*.txt">
  <ClCompile Include="a.cpp;b.cpp"/>
  <ClCompile Include="@(SomeItems)" />
</ItemGroup>

これらのコンストラクトを含むプロジェクト ファイルが IDE に読み込まれた場合、プロジェクトは最初は .vcxproj 動作しているように見える可能性があります。 ただし、問題は、プロジェクトが変更され、Visual Studioに保存されたとすぐに発生する可能性があります。 ランダムなクラッシュや未定義の動作が発生する可能性があります。

2019 Visual Studio 16.7 では、Visual Studio がプロジェクト ファイルを読み込むときに、プロジェクト項目のサポートされていないエントリが自動的に .vcxproj 検出されます。 ソリューションの読み込み中に [出力] ウィンドウに警告が表示されます。

Visual Studio 2019 バージョン 16.7 では、読み取り専用プロジェクトのサポートも追加されています。 読み取り専用のサポートにより、IDE で編集可能なプロジェクトの追加の制限を持たなかった手動で作成されたプロジェクトを IDE で使用できます。

サポートされていないコンストラクトの 1 つ以上を使用するファイルがある場合は、次のいずれかのオプションを使用して、IDE で警告なしで読み込 .vcxproj む必要があります。

  • すべての項目を明示的に一覧表示する
  • プロジェクトを読み取り専用としてマークする
  • ワイルドカード項目をターゲット本文に移動する

すべての項目を明示的に一覧表示する

現時点では、読み取り専用ではないプロジェクトの ソリューション エクスプローラーウィンドウにワイルドカード展開項目を表示する方法はありません。 ソリューション エクスプローラー、プロジェクトですべての項目が明示的に一覧表示される必要があります。

.vcxproj2019 バージョン 16.7 以降Visual Studioプロジェクトでワイルドカードを自動的に展開するには、 プロパティを ReplaceWildcardsInProjectItems に設定します true 。 ルート ディレクトリにファイルを Directory.Build.props 作成し、次のコンテンツを使用することをお勧めします。

<Project>
  <PropertyGroup>
    <ReplaceWildcardsInProjectItems>true</ReplaceWildcardsInProjectItems>
  </PropertyGroup>
</Project>

プロジェクトを読み取り専用としてマークする

2019 Visual Studio 16.7 以降では、プロジェクトを読み取り専用としてマークできます。 プロジェクトを読み取り専用としてマークするには、ファイルまたはインポートするファイルに次の .vcxproj プロパティを追加します。

<PropertyGroup>
    <ReadOnlyProject>true</ReadOnlyProject>
</PropertyGroup>

この設定ではVisual Studio編集や保存が行えないので、ワイルドカードを含むMSBuild任意の構成体 <ReadOnlyProject> を使用できます。

Visual Studio がファイル内のプロジェクト項目または任意のインポートでワイルドカードを検出した場合、プロジェクト キャッシュは使用できない点を知る .vcxproj 必要があります。 ワイルドカードを使用するプロジェクトが多数存在する場合、IDE のソリューションの読み込み時間ははるかに長くなります。

ワイルドカード項目をターゲット本文に移動する

ワイルドカードを使用してリソースを収集し、生成されたソースを追加することもできます。 このウィンドウに一覧表示する必要ソリューション エクスプローラー場合は、代わりに次の手順を使用できます。

  1. 項目グループの名前を変更して、ワイルドカードを追加します。 たとえば、次の代わりに、

    <Image Include="*.bmp" />
    <ClCompile Include="*.cpp" />
    

    次に変更します。

    <_WildCardImage Include="*.bmp" />
    <_WildCardClCompile Include="*.cpp" />
    
  2. このコンテンツをファイルに追加  .vcxproj します。 または、ルート ディレクトリ内のファイルに追加して、そのルートの下  Directory.Build.targets  のすべてのプロジェクトに影響を与えることができます。

    <Target Name="AddWildCardItems"
        AfterTargets="BuildGenerateSources">
      <ItemGroup>
        <Image Include="@(_WildCardImage)" />
        <ClCompile Include="@(_WildCardClCompile)" />
      </ItemGroup>
    </Target>
    

    この変更により、ファイルで定義されている項目がビルドに表示  .vcxproj されます。 ただし、現在は、このウィンドウに表示ソリューション エクスプローラー、IDE で問題が発生するわけではありません。

  3. エディターでこれらのファイルを開いた項目に対して正しい IntelliSense を表示するには、  _WildCardClCompile  次の内容を追加します。

    <PropertyGroup>
      <ComputeCompileInputsTargets>
        AddWildCardItems
        $(ComputeCompileInputsTargets)
      </ComputeCompileInputsTargets>
    </PropertyGroup>
    

実質的には、ターゲット本文内の任意の項目にワイルドカードを使用できます。 でプロジェクト項目として定義されていない でワイルドカード  ItemGroup  を使用   することもできます ProjectSchemaDefinition

Note

ワイルドカードの includes をファイルからインポートされたファイルに移動した場合、そのファイルは[ファイル] ウィンドウ .vcxproj ソリューション エクスプローラーされません。 この変更により、プロジェクトを変更せずに IDE に読み込むのも可能です。 ただし、プロジェクト キャッシュが無効になるので、この方法はお勧めしません。

こちらもご覧ください

Visual Studio で C++ コンパイラとビルド プロパティを設定する
プロパティ ページの XML ファイル