【问题标题】:How to use "Modern CMake" to set compiler flags? [duplicate]如何使用“现代 CMake”设置编译器标志? [复制]
【发布时间】:2018-06-23 07:51:58
【问题描述】:

我正在尝试通过一个简单的项目来学习 CMake。这是我的示例CMakeLists.txt

cmake_minimum_required(VERSION 3.11 FATAL_ERROR)
set(PROJECT_NAME "MyLib" CXX)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
project(${PROJECT_NAME})

include(${CMAKE_SOURCE_DIR}/Sources.cmake) 
set(SOURCE_FILES ${COMMON_CPP_FILES} ${COMMON_H_FILES})

include_directories(include)

add_compile_options("$<$<CONFIG:Debug>:/EHa /MTd /W3 /w14640>")

add_library(${PROJECT_NAME} STATIC ${SOURCE_FILES})

我尝试基于此文件创建一个 Visual Studio 项目,但我不知道如何正确设置编译标志。当我打开 Visual Studio 时,我可以看到标志 (/EHa) 作为“附加选项”的一部分,但我仍然可以看到默认 (/EHsc) 标志。

为什么默认标志仍然存在,我如何确保编译器确实在使用我指定的标志?

【问题讨论】:

  • 你在正确的轨道上。事实上,您应该为每个生成器表达式使用一个标志,或者您必须使用; 分号而不是空格来使其成为选项列表(否则它会被引用并解释为单个命令行选项)。因此,在您的情况下,它应该与 $&lt;$&lt;CONFIG:Debug&gt;:/EHa;/MTd;/W3;/w14640&gt; 一起使用。
  • @Florian 根据this 的回答,最好使用target_compile_options。但是,当我使用target_compile_options 时,我注意到标志并没有被替换,而是被简单地添加了,当我使用 ninja 时,我收到了警告,如 here 所述。但是,当我使用 add_compile_options 时,我没有收到任何警告,因为该命令似乎更智能,并且实际上是替换而不是添加。你推荐哪一个?

标签: c++ cmake


【解决方案1】:

您可以通过打印 CMAKE_CXX_FLAGS 和 CMAKE_CXX_FLAGS_{RELEASE|DEBUG} 来检查 CMake 使用的默认标志。 用类似的东西设置这些变量

set(CMAKE_CXX_FLAGS "") 

但不会清除它们。

我发现做你所说的唯一方法(清除特定的默认标志)对于每个默认标志都是这样的:

string(REPLACE "/EHsc" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
string(REPLACE "/RTC1" "" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")

但是,为什么你不能轻松清除所有默认标志并且没有这种语法是我无法理解的。

【讨论】:

  • 我一直在做类似的事情,但是到处都在大肆宣传“现代 CMake”,以及手动玩 CMAKE_CXX_FLAGS 是多么不好的做法,我希望像设置flags终于整理好了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-09-27
  • 2018-02-07
  • 2015-03-16
  • 1970-01-01
  • 2014-07-22
  • 1970-01-01
相关资源
最近更新 更多