CMake 3.1 引入了您可以使用的CMAKE_CXX_STANDARD变量。如果您知道您将始终拥有 CMake 3.1 或更高版本,您可以将其写入您的顶级 CMakeLists.txt 文件,或将其放在定义任何新目标之前:
set (CMAKE_CXX_STANDARD 11)
如果你需要支持旧版本的 CMake,这里有一个我想出的宏,你可以使用:
macro(use_cxx11)
if (CMAKE_VERSION VERSION_LESS "3.1")
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")
endif ()
else ()
set (CMAKE_CXX_STANDARD 11)
endif ()
endmacro(use_cxx11)
该宏目前仅支持 GCC,但应该可以直接将其扩展到其他编译器。
use_cxx11()
然后,您可以在任何定义使用 C++11 的目标的 CMakeLists.txt 文件的顶部编写代码。
针对 macOS 的 clang 用户的 CMake 问题 #15943
如果您使用 CMake 和 clang 来定位 macOS,则存在可能导致该功能无法正常工作的错误(不添加任何编译器标志)。CMAKE_CXX_STANDARD
确保您执行以下操作之一:
使用cmake_minimum_required要求 CMake 3.0 或更高版本,或
在命令前的 CMakeLists.txt 文件顶部使用以下代码将策略 CMP0025 设置为 NEW project
:
# Fix behavior of CMAKE_CXX_STANDARD when targeting macOS.
if (POLICY CMP0025)
cmake_policy(SET CMP0025 NEW)
endif ()