CMake 3.1发布于2014年,并引入了
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,但将其扩展到其他编译器应该很简单。
然后,您可以在任何定义使用C++11的目标的CMakeLists.txt文件顶部编写
use_cxx11()
。
CMake问题#15943适用于使用clang目标macOS的用户
如果您正在使用CMake和clang来目标macOS,存在一个
bug可能导致
CMAKE_CXX_STANDARD
功能根本不起作用(不添加任何编译器标志)。请确保您执行以下操作之一:
使用
cmake_minimum_required
来要求CMake 3.0或更高版本,或者在你的CMakeLists.txt文件的顶部,在
project
命令之前,使用以下代码将策略CMP0025设置为NEW:
```cmake
# 修复在macOS上定位CMAKE_CXX_STANDARD时的行为。
if (POLICY CMP0025)
cmake_policy(SET CMP0025 NEW)
endif ()
```
set(CMAKE_CXX_STANDARD 11)
(在定义目标之前)是最好的方法。 - emlaiCXX_STANDARD
在 MSVC 上不起作用,因此如果您想要跨平台的功能,基本上必须退回到target_compile_features
。 - Ela782