Msbuild 将文件包括到VS2017 c++;按条件工程

Msbuild 将文件包括到VS2017 c++;按条件工程,msbuild,visual-studio-2017,c-preprocessor,Msbuild,Visual Studio 2017,C Preprocessor,我正在尝试在VS2017中构建c/c++项目 [ 项目文件中有一些条件 <ClCompile Include="$(srcPath)odbcapi30.c" />\r <ClCompile Condition="'$(ANSI_VERSION)'=='no'" Include="$(srcPath)odbcapi30w.c" />\r <ClCompile Condition="'$(ANSI_VERSION)'=='no'" Include="$(srcPath)

我正在尝试在VS2017中构建c/c++项目 [

项目文件中有一些条件

<ClCompile Include="$(srcPath)odbcapi30.c" />\r
<ClCompile Condition="'$(ANSI_VERSION)'=='no'" Include="$(srcPath)odbcapi30w.c" />\r
<ClCompile Condition="'$(ANSI_VERSION)'=='no'" Include="$(srcPath)odbcapiw.c" />\r
\r
\r
\r
我创造了 Unicode调试/发布 ANSI调试/发布 构型 在projectproperties->c\c++->Preprocessor中,我为Unicode添加了ANSI_VERSION=no,为ANSI添加了ANSI_VERSION=yes


< P>但是,对于任何平台/配置,我都在解决方案资源管理器中看到这些文件,它们是由VS2017编译的。当条件为真时,如何将这些文件包含到Project中?

< P>条件要求ANSIIX版本是MSBuw属性。这些与C++预处理器定义不同。(这些是编译文件时使用的输入,但MSBUILD在测试要编译的文件时不使用这些输入-严格地说,它由预处理器使用,但从MSBUILD的角度来看,它是编译步骤的一部分)

可以在项目文件中将ANSI_版本设置为MSBUILD属性:-

例如:-

<PropertyGroup>
    <ANSI_VERSION>no</ANSI_VERSION>
    <ANSI_VERSION Condition="'$(Configuration)' == 'ANSI_DEBUG'">yes</ANSI_VERSION>
    <ANSI_VERSION Condition="'$(Configuration)' == 'ANSI_RELEASE'">yes</ANSI_VERSION>
</PropertyGroup>

不
对
对
上述ANSI_版本的默认值为no,当条件满足时覆盖为yes,但如果愿意,您也可以依次测试每个可能的配置

如果您愿意,还可以使用or将这些条件组合成单个条件

就我个人而言,我会使用true/false而不是yes/no。使用true-false,您可以将属性作为布尔值进行测试,而不是与字符串进行比较(虽然这可能也适用于yes/no,但我没有尝试过)

在回答问题时编辑: 以上有条件地将文件从生成中排除,将其从显示中排除有点不同,因为它需要UI重新分析项目以更新文件列表。您可能会发现,在项目中为这些文件创建筛选器更有效(即,在解决方案视图中右键单击project并使用Add->New Filter)。然后有条件地使用ExcludeFromBuild设置来控制实际编译它们的配置,而不是使CLCompile包含条件,例如:-

<ClCompile Include="SomeFile.cpp">
      <ExcludedFromBuild Condition="'$(Configuration)'=='Debug'">true</ExcludedFromBuild>
</ClCompile>

真的

谢谢!我看到了重要的区别。通过这种方式,我可以按条件包含文件,而不会在VS explorer中看到它们?