当前位置: 首页 > news >正文

在 CMakeLists.txt 中设置 C++23 标准

1. 引言

随着 C++ 标准的不断演进,C++23 引入了许多新特性和改进,如std::expectedstd::printstd::mdspan等。要在你的 C++ 项目中使用这些新特性,首先需要在构建系统中正确配置 C++23 标准。CMake 是目前最流行的跨平台构建系统之一,本文将详细介绍如何在CMakeLists.txt文件中设置 C++23 标准。

2. 设置 C++ 标准的方法

CMake 提供了多种方式来指定 C++ 标准,以下是几种常用方法,从现代到传统排序。

2.1 使用target_compile_features(推荐)

这是最现代、最推荐的方式,它允许你为特定的目标(可执行文件或库)指定所需的 C++ 特性,CMake 会自动推导出所需的最低标准版本。

cmake_minimum_required(VERSION 3.20) project(MyProject) add_executable(my_app main.cpp) 为 my_app 目标启用 C++23 标准 target_compile_features(my_app PRIVATE cxx_std_23)

优点:语义清晰,与目标绑定,CMake 会自动处理兼容性。

注意:需要 CMake 3.20 或更高版本才能识别cxx_std_23

2.2 使用set_target_properties设置CXX_STANDARD

你可以直接为目标设置CXX_STANDARD属性。

cmake_minimum_required(VERSION 3.8) project(MyProject) add_executable(my_app main.cpp) 设置 my_app 目标使用 C++23 标准 set_target_properties(my_app PROPERTIES CXX_STANDARD 23 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF )

参数解释

  • CXX_STANDARD 23:指定使用 C++23 标准。
  • CXX_STANDARD_REQUIRED ON:要求编译器必须支持 C++23,否则配置失败。
  • CXX_EXTENSIONS OFF:禁用编译器扩展(如 GNU 扩展),确保使用标准的 ISO C++。

2.3 使用全局变量CMAKE_CXX_STANDARD

如果你希望项目中所有目标都使用同一个 C++ 标准,可以设置全局变量。

cmake_minimum_required(VERSION 3.1) project(MyProject) 为项目中所有目标设置 C++23 标准 set(CMAKE_CXX_STANDARD 23) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) add_executable(my_app main.cpp) add_library(my_lib STATIC lib.cpp)

注意:此设置会影响之后定义的所有目标。

3. 检查编译器支持

并非所有编译器都完全支持 C++23。你可以在CMakeLists.txt中添加检查,或在配置时给出提示。

# 检查编译器是否声称支持 C++23 include(CheckCXXCompilerFlag) check_cxx_compiler_flag("-std=c++23" COMPILER_SUPPORTS_CXX23) if(COMPILER_SUPPORTS_CXX23) message(STATUS "编译器支持 C++23") else() message(WARNING "当前编译器可能不支持完整的 C++23 标准,某些特性可能不可用。") endif()

4. 完整示例

下面是一个完整的CMakeLists.txt示例,演示了如何为一个简单的项目设置 C++23 标准。

cmake_minimum_required(VERSION 3.20) project(MyCpp23Project VERSION 1.0.0 LANGUAGES CXX) 方法1:全局设置(可选,与方法2任选其一) set(CMAKE_CXX_STANDARD 23) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) 添加可执行文件 add_executable(my_app main.cpp) 方法2:为目标设置(推荐) target_compile_features(my_app PRIVATE cxx_std_23) 或者使用 set_target_properties set_target_properties(my_app PROPERTIES CXX_STANDARD 23 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF ) 可选:添加包含目录、链接库等 target_include_directories(my_app PRIVATE include) target_link_libraries(my_app PRIVATE some_library)

5. 常见问题与解决

5.1 配置失败,提示 “Cannot specify compile features for target ...”

原因target_compile_features需要在add_executableadd_library之后调用。

解决:确保调用顺序正确。

5.2 编译器报错,不认识 C++23 特性

可能原因

  1. 编译器版本过低(如 GCC < 13, Clang < 16, MSVC < 19.34)。
  2. CMake 生成的编译命令未正确包含-std=c++23标志。

解决

  • 升级编译器。
  • 检查 CMake 生成的构建文件(如build.ninjaMakefile),确认是否有-std=c++23标志。
  • 尝试显式设置编译标志(不推荐,可能破坏跨平台性):target_compile_options(my_app PRIVATE -std=c++23)

5.3 我想同时支持 C++17 和 C++23 怎么办?

通常为整个项目选择一个标准。如果库需要支持多标准,可以考虑使用条件编译或提供不同的构建目标。

6. 总结

CMakeLists.txt中设置 C++23 标准主要有三种方式:

  1. (最推荐)使用target_compile_features(my_target PRIVATE cxx_std_23),需要 CMake 3.20+。
  2. 使用set_target_properties设置CXX_STANDARD等属性。
  3. 设置全局变量CMAKE_CXX_STANDARD

建议始终设置CXX_STANDARD_REQUIRED ONCXX_EXTENSIONS OFF以确保严格的标准符合性和可移植性。配置后,即可在代码中安全地使用 C++23 的新特性。

http://www.jsqmd.com/news/1151890/

相关文章:

  • 【限时技术白皮书】:Claude 3.5 Opus与GPT-4o Turbo的LLM选型决策树(含21个垂直领域适配矩阵)——仅开放72小时下载权限
  • CSP 真题解析:[CSP-J 2019-T3] 纪念品
  • 用 Node.js 打造网站完整源码下载器
  • 机器学习极速入门:10小时掌握4大核心算法与实战
  • electron中拖动文件到桌面案例
  • Layerdivider:告别手动分层,让AI智能解析你的设计图
  • CAS:142131-37-1,p-NH2-Bn-NOTA,对氨基苄基-NOTA的使用
  • SEO 转 GEO 底层逻辑:哪些能力能复用?哪些必须推翻?
  • 谷歌学术无法访问?英文文献、SCI论文、DOI高效检索方案
  • 使用 Homebrew 安装 CMake 的完整指南
  • csdn保存的仅自己可见的文章无法确保不被用于训练AI
  • DVWA 1.10 命令注入实战:3种难度绕过与防御源码分析(附Payload)
  • 突破单总线瓶颈:任意MCU共用SCL实现多路I2C并行通信实战
  • RuView 新手快速上手指南
  • 国巨PA0402系列汽车级电流检测电阻是汽车电子的“电流之眼“
  • 测试工程师转型 AI 质量保障:从测 Bug 到测“智商“
  • vLLM 与 SGLang 推理框架性能横评:架构、吞吐与延迟深度解析
  • 使用CC Switch管理Codex需切换API地址的原因
  • 3类主流湿敏传感器对比:SHT系列、电阻式与电容式的选型指南
  • 特征选择实战:Sklearn 3大方法(Filter/Wrapper/Embedded)对比与20维数据集应用
  • Codex总是改错项目规则?AGENTS.md这5项必须写清楚
  • LLM应用的后端安全防护:Prompt注入防御与输出内容审核架构
  • 国内做高校AI 教育的公司有哪些?全景解析与实战云的独特路径
  • 欧盟商标申请全攻略,中国仍是最大的申请来源国!
  • OpenClaw专栏第六篇:Docker Compose一键部署与集群扩展
  • Maya保存会报错怎么解决?
  • 另外一个AI说csdn的私有文章不会用于训练AI
  • AD5593R与MSP432P401R的硬件协同设计与信号处理
  • 移动端开发者转型 AI Agent 开发:从 App 到智能助手
  • MQ-4 甲烷传感器 Arduino 实战:0-5V 模拟信号采集与 1000ppm 报警阈值设置