如何使用CMake在vcproj文件中设置属性?

7

Visual Studio中的vcproj文件包含各种设置或属性,这些设置会影响编译。例如,我正在尝试将一个项目转换为cmake,该项目使用的一些设置如下:

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

当然还有很多其他的属性可以设置,问题是使用cmake生成项目时如何设置它们。有没有人知道如何在使用cmake时设置这些属性,而不是在事后编辑vcproj文件?我找不到任何解释说明如何通过cmake设置这些属性。我只知道如何设置一些cmake特定的跨平台的东西(例如 PreprocessorDefinitionsAdditionalIncludeDirectories)。但我需要能够设置那些特定于Visual Studio的属性。

据我所知,所有这些属性都会转换为相应的命令行参数传递给编译器(链接器),因此您可以通过add_definition或set_target_properties添加这些参数。 - Alexey
3个回答

8
对于您列出的标志,您需要将以下内容添加到您的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变量中的任何冲突选项。

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

cmake --help-variable "CMAKE_<LANG>_FLAGS_DEBUG"
cmake --help-command set_target_properties
cmake --help-property COMPILE_FLAGS

Visual Studio编译器选项在此处列出。


看起来你也可以通过 add_definitions 设置编译器标志。 - Jonathan M Davis
是的 - 使用CMake通常有多种方法。Kitware的人非常注重保持向后兼容性,因此如果您找到一种有效的技术,它很可能会继续工作。我认为add_definitions最初设计用于设置预处理器定义,但在某个时候其功能已被扩展。 - Fraser
@Fraser,这似乎对GenerateXMLDocumentationFiles="true"或/doc标志无效。仅设置标志不会生成XML文件-它似乎依赖于.vcproj文件中的设置。有关如何使用CMake激活此功能的任何提示吗? - Kohanz
对于额外的属性,可以使用带有 -- 的命令参数,例如 cmake --build . --config Release -- -property:GenerateFullPaths=true -v:q - KRoy

1

这些属性都对应着编译器(cl)的命令行选项。您可以在 CMakeLists 中设置这些命令行选项(使用变量,例如 CMAKE_CXX_FLAGS,命令,例如 add_definitions() 以及属性,例如 COMPILE_FLAGS),当生成 .vc[x]proj 文件时,CMake 会自动将它们转换为相应的设置。CMake 不理解的选项将被添加为“其他命令行选项”。


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


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

"

VS_GLOBAL_ 可以设置为添加一个特定于 Visual Studio 项目的全局变量。如果设置了 VS_GLOBAL_QtVersion 为 FindQt4.cmake 找到的 Qt 版本,则 Qt 集成效果更佳。例如,“4.7.3”

来源: https://cmake.org/cmake/help/v3.20/prop_tgt/VS_GLOBAL_variable.html"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接