【问题标题】:Add Visual C++ property sheets using CMake使用 CMake 添加 Visual C++ 属性表
【发布时间】:2011-02-27 17:34:09
【问题描述】:

我目前正在将一个 gcc 项目移植到 Visual C++。它在 CMake 文件中定义,并且我创建了一个 Visual C++ 属性表来帮助提高兼容性 (GccCompat.props)。每次 CMake 重新生成 Visual C++ 项目文件时,都必须手动添加属性表,因为我不知道如何自动添加它。所以,问题是:

如何告诉 CMake 向生成的 Visual C++ 解决方案添加属性表?

【问题讨论】:

  • 这是我使用 CMake 时为数不多的缺点之一:它通常似乎将您限制在工具之间的最低公分母上,或者它对特殊功能的支持是深奥的。我不是专家,但我猜你必须对生成的文件进行某种后处理。
  • 知道如何对生成的文件进行后期处理吗?我会有自己的脚本对它们进行后处理,但似乎 CMake 将作为 VS 构建过程的一部分重新生成,覆盖我的更改。 CMake 上似乎也没有生成后挂钩...

标签: visual-c++ visual-studio-2010 cmake propertysheet


【解决方案1】:

此功能已进入 CMake 的夜间构建 (https://gitlab.kitware.com/cmake/cmake/commit/e390991846825799e619e072a28f1da58b7c89ba),尽管尚未进入稳定版本。理论上会在下一个版本,CMake的版本发布比较频繁。

要使用,您可以在目标上设置VS_USER_PROPS 属性。例如。 set_target_properties(foo PROPERTIES VS_USER_PROPS "${props_file}")

但是,您似乎无法通过此选项使用多个属性表,并且它替换了默认的用户属性文件 ($(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props)。要解决此问题,属性表可以包含其他属性表,因此,您可以制作一个“主”属性表,其中包含您想要使用的任何其他属性表(包括默认用户属性表)。

【讨论】:

  • 该属性已重命名为VS_USER_PROPS
  • 2018 年 2 月更新:此功能现在是 CMake 3.8 版的一部分(如果我的英特尔是正确的)。它运作良好。
  • 进一步更新:我发现我的 MSVC 不会加载 props 文件,除非它被复制到 .proj 文件旁边,所以我必须添加一个复制命令(通过 configure_file( ... COPYONLY) ) 在 CMake 中实现这一点。显然,道具文件中项目的 order 很重要。
  • 那么当您尝试将此 CMake 设置用于除 msbuild 之外的任何构建系统其他时会发生什么?
【解决方案2】:

这个问题有点老了,但我最近在将 GStreamer 集成到我的项目中时偶然发现了同样的问题。 GStreamer 带有一组准备充分的高质量属性表,我想使用它们而不是在 CMake 中乱搞。

幸运的是,此问题仅限于 Windows 和 Visual Studio。所以这是我的解决方案:

这个想法是使用 Visual Studio 的 .user 文件 功能。 CMake 不会生成此文件,因此在配置时生成它是非常安全的。在配置时,您可以生成一个具有 EXACT 名称的文件作为您的项目文件,但以 .user 扩展名结尾。

部分解决方案:

如果您的项目文件名为my_project.vcxproj,您需要在其旁边创建另一个名为my_project.vcxproj.user 的文件。 According to MSDN:

用户文件 (.vcxproj.user) 存储用户特定的属性,例如 例如,调试和部署设置。 vcxproj.user 文件 适用于特定用户的所有项目。

这个用于导入属性表的文件的内容是这样的:

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="/path/to/sheet1.props" />
  <Import Project="/path/to/sheet2.props" />
</Project>

并非完美无缺,但在 CMake 开始支持属性表之前一直有效。该文件可以在配置时使用 CMake 的 file 命令创建。

潜在警告:

我注意到,当我以这种方式添加属性表时,有时它们不会显示在“属性管理器”窗口中(可能是 Visual Studio Community 2013 中的一个错误),但它们总是被正确导入并且依赖关系被正确解析。

【讨论】:

    【解决方案3】:

    不确定您需要哪些属性。一些可以直接在 CMake 中设置,例如在此示例中用于多个配置:

    set (CMAKE_CONFIGURATION_TYPES "A;B;C;D" CACHE STRING "Configurations" FORCE)
    
    foreach( OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES} )
    
        set (CMAKE_CXX_FLAGS_${OUTPUTCONFIG}                "/ZI /Od")
        set (CMAKE_EXE_LINKER_FLAGS_${OUTPUTCONFIG}         "/debug")
    
    endforeach( OUTPUTCONFIG CMAKE_CONFIGURATION_TYPES )
    

    除了变量listed here,我认为CMake不可能附加属性表。

    【讨论】:

    • @kfsone 您的第 1 点相当无关紧要,因为这是一个 5 年前的答案。并且不禁止链接到“非官​​方”页面。
    • @MarkRotteveel 我并没有暗示这是某种形式的道德违规,但答案的很大一部分被防火墙隐藏在一个不再指向官方的链接后面网站,删除答案的价值,以及不鼓励的事情 - 鼓励答案引用链接页面的相关位,以防止发生这种情况。
    • @MarkRotteveel 具体来说 - 此答案的 only 正确和有用的部分是链接,它是一个已弃用的链接。如果答案的其余部分不是不准确且没有帮助的,那么我会编辑答案以更新链接并引用变量。
    猜你喜欢
    • 1970-01-01
    • 2010-12-20
    • 2015-04-01
    • 2015-12-12
    • 2011-09-11
    • 2021-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多