【问题标题】:How do you set properties in a vcproj file with cmake?如何使用 cmake 在 vcproj 文件中设置属性?
【发布时间】:2013-01-03 22:36:31
【问题描述】:

Visual Studio 的 vcproj 文件包含影响构建的各种设置或属性。例如,我试图转换为 cmake 的项目使用的一些是

StringPooling="true"
RuntimeLibrary="2"
TreatWChar_tAsBuiltInType="true"
WarningLevel="3"
Detect64BitPortabilityProblems="false"

当然还有很多其他可以设置的。问题是如何在使用 cmake 生成项目时设置它们。除了事后编辑 vcproj 文件之外,有谁知道如何在使用 cmake 时设置这些类型的属性?我找不到任何解释如何通过 cmake 设置这些属性的内容。我唯一知道如何设置的是 cmake 专门用于跨平台的东西(例如 PreprocessorDefinitionsAdditionalIncludeDirectories)。但我需要能够设置特定于 Visual Studio 的设置。

【问题讨论】:

  • 据我所知,所有这些属性都转换为编译器(链接器)的相应命令行参数,因此您可以通过 add_definition 或 set_target_properties 添加这些参数

标签: windows visual-studio cmake


【解决方案1】:

对于您列出的标志,您需要将以下内容添加到您的 CMakeLists.txt:

if(MSVC)
  # StringPooling: true == /GF  false == /GF-
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /GF")

  # RuntimeLibrary
  # 0 (MultiThreaded) == /MT
  # 1 (MultiThreadedDebug) == /MTd
  # 2 (MultiThreadedDLL) == /MD
  # 3 (MultiThreadedDebugDLL) == /MDd
  set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MD")
  set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MDd")

  # TreatWChar_tAsBuiltInType: true == /Zc:wchar_t  false == /Zc:wchar_t-
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zc:wchar_t")

  # WarningLevel: /W<level 0 to 4> or /Wall
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W3")

  # Detect64BitPortabilityProblems: /Wp64 - Deprecated since VC++ 2010 
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Wp64")
endif()

如果需要,您可以将这些组合到一个电话中:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /GF /Zc:wchar_t /W3 /Wp64")

如果您只需要为单个目标添加一个标志(例如,MyTestExe),您可以这样做:

set_target_properties(MyTestExe PROPERTIES COMPILE_FLAGS "/GF- /W2")

通过此特定于目标的方法设置的选项将覆盖通用 CMAKE_CXX_FLAGS 变量中的任何冲突选项。

有关这些命令的更多信息,请执行以下操作:

@987654321@
@987654322@
@987654323@

列出了 Visual Studio 编译器选项here

【讨论】:

  • 看来你也可以通过add_definitions设置编译器标志。
  • 是的 - 使用 CMake 做事的方式通常不止一种。 Kitware 的人非常注重保持向后兼容性,所以如果你找到一种可行的技术,它很可能会继续工作。我认为add_definitions 最初设计用于设置预处理器定义,但在某些时候它的功能已被扩展。
  • @Fraser 这似乎不适用于 GenerateXMLDocumentationFiles="true" 或 /doc 标志。仅设置标志不会生成 XML 文件 - 它似乎依赖于 .vcproj 文件中的设置。有关如何使用 CMake 激活此功能的任何提示?
  • 对于额外的属性,使用命令 args 和 -- like, cmake --build . --config Release -- -property:GenerateFullPaths=true -v:q
【解决方案2】:

这些属性中的每一个都对应于编译器的一个命令行选项 (cl)。您在 CMakeList 中设置这些命令行选项(使用 CMAKE_CXX_FLAGS 之类的变量、add_definitions() 之类的命令和COMPILE_FLAGS 之类的属性),CMake 会在生成它们时自动将它们转换为 .vc[x]proj 文件中的设置。那些它不理解的只是添加为“附加命令行选项”。

【讨论】:

    【解决方案3】:

    一般来说,你可以这样做:

    set_target_properties(target_name
                          PROPERTIES VS_GLOBAL_CAExcludePath "....")
    

    "VS_GLOBAL_ 可以设置为添加 Visual Studio 项目特定的全局变量。如果将 VS_GLOBAL_QtVersion 设置为找到的 Qt 版本 FindQt4.cmake,则 Qt 集成效果更好。例如,“4.7.3”" 来源:https://cmake.org/cmake/help/v3.20/prop_tgt/VS_GLOBAL_variable.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-16
      • 2014-06-09
      • 1970-01-01
      • 2019-12-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多