我目前正在将一个 gcc 项目移植到 Visual C++。它在 CMake 文件中定义,并且我创建了一个 Visual C++ 属性表以帮助提高兼容性 (GccCompat.props)。每次 CMake 重新生成 Visual C++ 项目文件时,都必须手动添加属性表,因为我不知道如何自动添加它。所以,问题是:
如何告诉 CMake 向生成的 Visual C++ 解决方案添加属性表?
我目前正在将一个 gcc 项目移植到 Visual C++。它在 CMake 文件中定义,并且我创建了一个 Visual C++ 属性表以帮助提高兼容性 (GccCompat.props)。每次 CMake 重新生成 Visual C++ 项目文件时,都必须手动添加属性表,因为我不知道如何自动添加它。所以,问题是:
如何告诉 CMake 向生成的 Visual C++ 解决方案添加属性表?
此功能已进入 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
)。要解决此问题,属性表可以包含其他属性表,因此,您可以制作一个“主”属性表,其中包含您想要使用的任何其他属性表(包括默认用户属性表)。
这个问题有点老了,但我最近在将 GStreamer 集成到我的项目中时偶然发现了同样的问题。GStreamer 带有一组准备充分的高质量属性表,我想使用它们而不是在 CMake 中乱搞东西。
幸运的是,这个问题仅限于 Windows 和 Visual Studio。所以这是我的解决方案:
这个想法是使用Visual Studio 的 .user 文件功能。CMake 不会生成此文件,因此在配置时生成它非常安全。在配置时,您可以生成一个文件,该文件的名称与您的项目文件一样,但以 .user 扩展名结尾。
如果您的项目文件被命名my_project.vcxproj
,您需要在它旁边创建另一个名为my_project.vcxproj.user
. 根据 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 开始支持属性表之前一直有效。该文件可以file
在配置时使用 CMake 的命令创建。
我注意到当我以这种方式添加属性表时,有时它们不会显示在“属性管理器”窗口中(可能是 Visual Studio Community 2013 中的一个错误),但它们总是被正确导入并且依赖关系被正确解析。
不确定您需要哪些属性。一些可以直接在 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 )
除了这里列出的变量,我认为 CMake 不可能附加属性表。