按条件将文件包含到VS2017 C ++项目

时间:2019-02-13 12:42:29

标签: msbuild visual-studio-2017 c-preprocessor

我正在尝试在VS2017中构建c / c ++项目 [https://git.postgresql.org/gitweb/?p=psqlodbc.git;a=blob;f=winbuild/psqlodbc.vcxproj;h=c54c93007c07c2b13bbea4ede14a6ee0e11fdf5a;hb=c54c93007c07c2b13bbea4ede14a6ee0e11fdf5a][1]

项目文件中有条件

<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

我创建了 Unicode调试/发布 ANSI调试/发布 配置 在项目属性-> c \ c ++->预处理器中,我为Unicode添加了ANSI_VERSION = no,为ANSI添加了ANSI_VERSION = yes。

但是对于任何平台/配置,我都在解决方案资源管理器中看到这些文件,它们是由VS2017编译的。仅在条件为真的情况下如何将这些文件包括到项目中?

1 个答案:

答案 0 :(得分:1)

该条件要求ANSI_VERSION是MSBuild属性。这些与C ++预处理程序定义不同(后者是编译文件时使用的输入,但在测试要编译的文件时不被MSBUILD使用-严格来说,预处理程序使用了它,但从msbuild点开始,它是编译步骤的一部分的观点)

您可以在项目文件中将ANSI_VERSION设置为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_VERSION设置为no,并在满足条件时将其覆盖为yes,但是如果愿意,您也可以依次测试每个可能的配置。

如果您愿意,也可以将条件合并为一个条件。

我个人会使用true / false而不是yes / no。设置为true时,您可以仅将该属性作为布尔值进行测试,而不能与字符串进行比较(尽管也许也可以使用yes / no-但我没有尝试过)

编辑以回答问题: 上面有条件地从构建中排除文件,从显示中排除它们有点不同,因为这需要UI重新解析项目以更新文件列表。您可能会发现更合适的方法是在项目中为这些文件创建过滤器(即,在解决方案视图中右键单击项目,然后使用“添加”->“新建过滤器”)。然后有条件地使用ExcludeFromBuild设置来控制哪些配置实际对它们进行编译,而不是使CLCompile包含条件,例如:-

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