我们在工作中使用 Visual Studio 2013,我最近遇到了一个我以前从未见过的问题。
我们有一个在 _i.c 文件中包含一些 COM 定义的项目。问题是当我们向项目和解决方案添加两个配置时,这些配置不是独立的,它们似乎是绑定的,但仅在预编译的标头设置中,这些设置旨在覆盖该文件的项目行为。
原来Project和Solution里面有两个配置,Debug和Release。
这些是 MCBS 版本。最近我们需要额外的Unicode版本,所以现在有4个配置Debug,Release,Debug-UNICODE,Release-UNICODE。
C++ 预编译头文件的全局项目设置是“使用 (/Yu)”,这对于原始调试和发布配置都是如此(现在也是新配置)
然后 _i.c 文件再次具有“不使用预编译头文件”的特定设置,这在原始调试和发布配置中是正确的。
现在我们已经添加了另外两个配置,当您尝试构建它们时,当构建到达 _i.c 文件时,您要么被告知 a) 预编译的头文件来自先前版本的编译器,或者 b)编译器找不到 stdafx.h
但是,根据该文件的项目设置(由 IDE 提供),该文件不应该使用预编译的头文件,但它正在尝试这样做。
值得注意的是,当您更改 Release Configuration 下的 files 设置时,您会注意到 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 无法正确写入