在C ++项目中设置CMAKE_CXX_FLAG的影响

时间:2018-10-07 15:18:39

标签: c++ cmake

我有一个C ++项目,我想在该项目中使用CMake。我的项目有多个目录和子目录。

我有一个顶层CMakeLists.txt,它可以构建整个项目。我在子目录中也有CMakeLists.txt。我想设置编译器标志,但这是我感到困惑的地方。 CMake中的编译器标志的作用仅适用于相应的目录,还是适用于整个项目?

例如,我的项目(简称为MyProject)与CMakeLists.txt相关联。该项目有两个子目录AB。每个都有自己的CMakeLists.txt。在A/CMakelist.txt中,我将编译器标志设置如下:

set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++1y -Wno-narrowing")

B/CMakeLists.txt如下:

set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++1y")

我不明白的是,编译器是否还会对子目录-Wno-narrowing中的cpp文件也使用标志B(通常会应用于整个项目)?

CMakeList.txt中设置编译器标志(通常是任何变量)的范围仅适用于相应的目录,还是将在整个项目中全局应用?

1 个答案:

答案 0 :(得分:2)

CMake的set command适用于功能和目录范围。也就是说,如果您像在CMake函数之外设置变量一样,效果将在该目录及其所有子目录中可见。

每当您定义新目标(通过调用add_executableadd_library)时,CMAKE_CXX_FLAG变量此时的值都将用于确定编译标志的目标属性的初始值。

因此-Wno-narrowing选项应该不能从一个子目录泄漏到同级子目录。

关于现代CMake样式的快速说明:与直接设置-std选项相比,更喜欢使用compile features functionalities。前者将是可移植的,并且可以在所有工具链和编译器版本上使用。例如,要对项目中的所有目标全局要求C ++ 14,只需在顶级CMakelist中使用set(CMAKE_CXX_STANDARD 14)。同样,请考虑使用target_compile_options命令来设置仅适用于您项目的某些目标的选项。使用该命令通常比摆弄全局变量更容易出错。 对于-Wno-narrowing之类的手动工具专用标志,请考虑将其包装在generator expression中,以确保它们仅在支持该标志的工具链上使用。