已配置CMake使用C++20标准编译,但可执行文件仍以C++17编译的问题求助
解决CMake无法配置C++20编译的问题
我来帮你梳理下当前CMake配置里的几个关键问题,以及对应的修复方案:
1. 变量名拼写错误
你的配置里写了set(CXX_STANDARD_REQUIRED ON),但正确的变量名应该是CMAKE_CXX_STANDARD_REQUIRED——少了开头的CMAKE_前缀,导致这个强制要求C++标准的配置根本没生效。
2. 缺少project()初始化命令
CMake需要通过project()命令来初始化项目环境,你的配置里完全没有这个命令,这会导致后续的CMAKE_CXX_STANDARD设置无法正确关联到编译目标上。
3. GCC版本与C++20支持的匹配
虽然你已经升级到GCC 10.3.0(这个版本对C20的支持已经比较完善,包括constexpr std::fill),但还是需要确保CMake正确识别到新版本的编译器,并且配置纯C20标准而非带GNU扩展的版本。
修正后的CMakeLists.txt示例
cmake_minimum_required(VERSION 3.21.3 FATAL_ERROR) # 先设置C++标准相关配置,要在project()之前 set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) # 禁用GNU扩展,确保使用纯C++20标准 list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) option(OPTIMISER "Optimiser level 3" OFF) # 初始化项目,指定语言为C++ project(YourProjectName LANGUAGES CXX) # 添加你的编译目标(比如可执行文件) add_executable(your_executable main.cpp) # 如果开启了优化选项,添加对应的编译参数 if(OPTIMISER) target_compile_options(your_executable PRIVATE -O3) endif()
额外验证步骤
- 清理旧的构建目录,重新配置:
rm -rf build && mkdir build && cd build cmake ..
- 检查编译命令:在构建目录里运行
make VERBOSE=1,查看编译参数里是否包含-std=c++20(而不是-std=gnu++20)。 - 验证
__cplusplus宏:在代码里添加一行输出:
#include <iostream> int main() { std::cout << "__cplusplus value: " << __cplusplus << std::endl; // 你的其他代码... }
正常情况下,输出应该是202002(对应C++20标准)。
补充说明
如果你升级GCC后CMake还是识别旧版本,可以手动指定编译器路径:
cmake .. -DCMAKE_C_COMPILER=/usr/bin/gcc-10 -DCMAKE_CXX_COMPILER=/usr/bin/g++-10
GCC 10.3.0已经支持constexpr std::fill,修正CMake配置后你的示例代码应该可以正常编译。
内容的提问来源于stack exchange,提问作者niran90
相关产品推荐
相关产品推荐

