如何使用“现代CMake”设置编译器标志?

时间:2018-06-23 07:51:59

标签: c++ cmake

我试图通过一个简单的项目学习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)标志。

enter image description here

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

1 个答案:

答案 0 :(得分: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}")

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