You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

已配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 18:49:04