cmake--指定c++版本
CMAKE_CXX_STANDARD
CMAKE_CXX_STANDARD 是指定所使用的 C++ 标准版本。
CMAKE_CXX_STANDARED_REQUIRED
CMAKE_CXX_STANDARD_REQUIRED 表示使用 C++ 标准时,是否必须使用指定的版本。如果将其设置为 ON,则只有在可以使用所指定的 C++ 标准时,才会构建项目。如果将其设置为 OFF,则可以尝试使用较旧的 C++ 标准构建项目。
`CMAKE_CXX_STANDARD_REQUIRED` 是一个布尔值变量,用于指定是否强制使用 `CMAKE_CXX_STANDARD` 中设置的 C++ 版本。如果设置为 `ON`,那么 CMake 会要求编译器必须支持 `CMAKE_CXX_STANDARD` 中设置的 C++ 版本,否则会配置失败。如果设置为 `OFF` 或者未设置,那么如果编译器不支持 `CMAKE_CXX_STANDARD` 中设置的 C++ 版本,CMake 会回退到编译器支持的最新版本---链接
CMAKE_CXX_EXTENSIONS
什么是编译器扩展
编译器扩展是指 编译器提供的、超出 C/C++ 语法标准(ISO)的额外功能。例如:
-
GCC/Clang 扩展:
-
__attribute__((packed))(强制结构体紧凑存储) -
#include <bits/stdc++.h>(GCC 特有的万能头文件) -
typeof(x)(GCC 的类型推断,标准 C++ 应使用decltype(x))
-
-
MSVC 扩展:
-
__declspec(dllexport)(Windows DLL 导出符号) -
#pragma once(非标准但广泛支持的头文件保护)
-
什么是标准 C++(ISO C++)
-
跨平台一致性:所有符合标准的编译器(GCC、Clang、MSVC 等)必须实现相同的语言特性。
-
稳定演进:ISO 定期发布新标准(如 C++11、C++17、C++20),引入新特性但不随意破坏旧代码。
-
标准库统一:提供
STL(如vector、string)、<algorithm>等通用组件,行为在所有平台上一致。
所以每一个C++11、C++17、C++20版本就是一个编译器的标准。
为什么需要控制编译器扩展?
-
可移植性:确保代码在其他编译器(如 MSVC)上也可以编译。
-
标准合规性:某些项目(如嵌入式系统、安全关键代码)要求严格遵循 ISO 标准。
-
确保代码在 GCC、Clang、MSVC 等不同编译器下行为一致。
cmake_cxx_extensions是CMake中的一个变量,用于设置编译器构建当前项目是否使用超出指定标准的,这个编译器可以提供的语法和功能。
set(CMAKE_CXX_EXTENSIONS OFF)----不能使用扩展语法和功能。
set(CMAKE_CXX_EXTENSIONS ON)----可以使用其他扩展语法和功能。
案例
# Set c++ standard
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON) #必须使用指定的c++20才能构建项目
set(CMAKE_CXX_EXTENSIONS OFF) #不支持编译器含有的,超出c++20的语法的其他扩展
更多推荐
所有评论(0)