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

Posted

技术标签:

【中文标题】按条件将文件包含到 VS2017 c++ 项目中【英文标题】:Include file to VS2017 c++ project by condition 【发布时间】:2019-02-13 12:42:29 【问题描述】:

我正在尝试在 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】:

条件要求 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 您可以将属性测试为布尔值而不是与字符串进行比较(尽管也许这也适用于是/否 - 但我没有尝试过)

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

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

【讨论】:

谢谢!我看到了重要的区别。使用这种方式,我可以按条件包含文件,并且在 VS 资源管理器中看不到它们?

以上是关于按条件将文件包含到 VS2017 c++ 项目中的主要内容,如果未能解决你的问题,请参考以下文章

C++ 无法打开源文件

VS2017 将手动配置为 x86 的 C++ 项目加载为 VS2010 项目

将 3rd-party C++ DLL 引用到 VS 2013 项目中

vs 2008 部署项目不工作

VS2019没有C++?

多个错误,在VS2017的头文件中,opengl项目C++