gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 02:04:58 53 4
gpt4 key购买 nike

我有一个 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")

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

CMakeList.txt中设置一个编译器flag(一般是任意变量)的范围是只适用于对应的目录,还是会在整个项目中全局应用?

最佳答案

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

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

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

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

关于c++ - 在 C++ 项目中设置 CMAKE_CXX_FLAG 的影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52689945/

53 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com