cmake如何在C ++中将编译器标志附加到末尾

Posted

技术标签:

【中文标题】cmake如何在C ++中将编译器标志附加到末尾【英文标题】:cmake how to append compiler flags to the end in C++ 【发布时间】:2018-05-03 10:18:32 【问题描述】:

我想将编译器 C++ 标准设置为 gnu++17,但我不能用 CMAKE_CXX_STANDARD 做到这一点,因为它给我的 gnu++17 是无效值。因此我把它放在 CMAKE_CXX_FLAGS 中。但是当我编译 cmake 时,将std=gnu++11 附加到命令的末尾,如下所示:-

/bin/g++ -Wall -Wpedantic -Wextra -std=gnu++14 -no-pie   -fPIC -std=gnu++11 -o /path/to/main.cpp.o -c /blah/blahfeeelk

因此std=gnu++11 获胜。所以想在末尾追加gnu++17。 我怎样才能做到这一点 ? (我已经修剪了原来的命令)

【问题讨论】:

【参考方案1】:

CMake 具有三个变量来控制 C++ 标准的版本和打开/关闭编译器扩展。我在这里展示了目标特定的版本,因为它应该在相当现代的 (v3.x) CMake 中使用。

add_executable(foo main.cpp)
set_target_properties(foo PROPERTIES
    CXX_STANDARD 17
    CXX_STANDARD_REQUIRED ON
    CXX_EXTENSIONS ON
)

这将启用 C++17,防止在 17 不可用时自动回退到较早的标准,并启用编译器扩展。对于 GCC,这相当于 -std=gnu++17-std=gnu++1z

CXX_STANDARD 与 17 值自 CMake 3.8 起可用。 CXX_STANDARD_REQUIRED 和 CXX_EXTENSIONS 自 CMake 3.1 起就存在。

【讨论】:

这仅适用于被 cmake 列入白名单的 std 版本。它不适用于 c++2a。对此的解决方案会很好(因为在我的情况下不断添加-std=gnu++11 标志)

以上是关于cmake如何在C ++中将编译器标志附加到末尾的主要内容,如果未能解决你的问题,请参考以下文章

有人可以解释如何在 C 编程中将元素附加到数组中吗?

sh 如何在shell脚本/ bash中将输出附加到文本文件的末尾?

如何在Java中的ArrayList末尾附加元素?

在 C 中将 Int 附加到 char *

如何在golang中将字节附加到字节数组?不是字节数组到字节数组切片等[重复]

如何从 C 中将新的字符串元素附加到 Swift 中的数组