仕事で Visual Studio 2013 を使用していますが、最近、これまで見たことのない問題に遭遇しました。
_i.c ファイルにいくつかの COM 定義を含むプロジェクトがあります。問題は、プロジェクトとソリューションに 2 つの構成を追加したときです。これらの構成は独立しているのではなく、関連付けられているように見えますが、このファイルのプロジェクトの動作をオーバーライドすることを意図したプリコンパイル済みヘッダー設定内でのみです。
もともと、プロジェクトとソリューションには、デバッグとリリースの 2 つの構成がありました。
これらは MCBS ビルドでした。最近、追加の Unicode バージョンが必要になったため、現在、Debug、Release、Debug-UNICODE、Release-UNICODE の 4 つの構成があります。
C++ プリコンパイル済みヘッダー ファイルのグローバル プロジェクト設定は "Use (/Yu)" です。これは、元のデバッグ構成とリリース構成の両方に当てはまります (現在は新しい構成も)。
次に、_i.c ファイルには「プリコンパイル済みヘッダーを使用しない」という特定の設定があります。これは、元のデバッグおよびリリース構成に当てはまります。
これらの他の 2 つの構成を追加したので、ビルドが _i.c ファイルに到達したときにそれらをビルドしようとすると、a) プリコンパイル済みヘッダー ファイルがコンパイラの以前のバージョンのものである、または b)コンパイラは stdafx.h を見つけられませんでした
ただし、ファイルは、このファイルのプロジェクト設定 (IDE によって提示される) に従ってプリコンパイル済みヘッダーを使用することは想定されていませんが、そうしようとしています。
Release Configuration でファイルの設定を変更すると、Release-UNICODE も同じ設定に変更されていることに注意してください (逆も同様です)。Debug および Debug-UNICODE についても同様です。
[X]-UNICODE 構成は、[X] 構成のコピーとして作成されましたが、共有することを意図していません。プリコンパイル済みヘッダー以外のすべての設定は、独立したままです。
また、_i.c ファイルの下に保存されたプロジェクトを見ると、実際にはすべての構成がリストされているわけではありません。
<ItemGroup>
...
<ClCompile Include="<filename>_i.c">
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug-UNICODE|Win32'">NotUsing</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release-UNICODE|Win32'">NotUsing</PrecompiledHeader>
</ClCompile>
...
IDE を無視すると、プロジェクトは .vcxproj ファイルの内容に従って正しくビルドされます。問題は、IDE が正しく書き込めないことです。