0

0

c++如何在Qt中使用C++17/20 c++ QMake/CMake配置【技巧】

尼克

尼克

发布时间:2026-01-06 08:26:02

|

547人浏览过

|

来源于php中文网

原创

c++kquote>在 Qt 项目中启用 C++17/C++20 需通过 CMake(推荐)或 qmake 配置编译器标准,确保编译器版本匹配(如 MSVC 2019 16.10+、GCC ≥10、Clang ≥12),Qt 6.x 原生支持 C++17/20,Qt 5.15 仅实验性支持 C++20。

c++如何在qt中使用c++17/20 c++ qmake/cmake配置【技巧】

在 Qt 项目中启用 C++17 或 C++20,关键在于正确配置构建系统(qmake 或 CMake),并确保编译器支持对应标准。Qt 本身不控制语言标准,而是由底层编译器(如 MSVC、Clang、GCC)决定是否支持及如何启用。

CMake 配置(推荐方式)

CMake 是 Qt 官方推荐的构建系统(尤其从 Qt 6 起),配置清晰且跨平台兼容性好。

  • CMakeLists.txt 中设置 C++ 标准(Qt 5.15+ / Qt 6.x 均适用):
set(CMAKE_CXX_STANDARD 17) # 或 20
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF) # 禁用 GNU 扩展,保证标准合规

这会让所有 target 自动继承该标准。若需为特定 target 单独设置(如仅对某个库启用 C++20):

target_compile_features(your_target PRIVATE cxx_std_20 cxx_concepts cxx_ranges)
target_compile_options(your_target PRIVATE -std=c++20)

注意:target_compile_features 可检查特性可用性,比单纯设 -std 更安全;Qt 6.2+ 对 cxx_conceptscxx_modules(需编译器支持)等已有良好适配。

立即学习C++免费学习笔记(深入)”;

qmake 配置(传统 Qt 5 项目常用)

qmake 通过 QMAKE_CXXFLAGS 或更规范的 CONFIG 项启用新标准。

GPTBots
GPTBots

企业级AI智能体构建平台

下载
  • .pro 文件中添加(Qt 5.12+ 支持):
CONFIG += c++17 # 或 c++20(Qt 5.15+ / Qt 6.0+)
# 或显式指定(兼容旧版 qmake):
QMAKE_CXXFLAGS += -std=gnu++17

⚠️ 注意:使用 c++17(无下划线)是 qmake 内置 CONFIG 值,会自动适配不同编译器(如 MSVC 用 /std:c++17,GCC/Clang 用 -std=gnu++17)。避免混用 -std=c++17gnu++17,后者默认启用扩展,可能影响可移植性。

若项目含多个 subdirs,可在根 .pro 中统一设置,子项目自动继承。

编译器与 Qt 版本匹配要点

不是所有 Qt + 编译器组合都原生支持 C++20 特性:

  • MSVC:Visual Studio 2019 16.10+ 支持大部分 C++20;Qt 6.2+ 官方构建默认启用 C++17;
  • GCC:建议 ≥ 10(C++20 部分特性)或 ≥ 11(较完整);Qt 官方 Linux 包通常基于 GCC 10+;
  • Clang:≥ 12 对 C++20 支持较好;macOS Xcode 13+(Clang 13)可放心用 C++20;
  • Qt 5.15 LTS:官方支持 C++17,C++20 属实验性,需手动加 -std=c++20 并自行验证稳定性;
  • Qt 6.x:从设计上以 C++17 为基线,C++20 是一等公民,模块如 QMetaTypeQVariant 已适配 std::optionalstd::variant 等。

实际编码与 Qt 兼容提示

启用新标准后,可直接使用现代语法,但要注意 Qt API 的衔接:

  • std::string_view 替代 const QString & 做只读参数(需 Qt 6.4+ 或自定义转换);
  • Qt 6 中 QString::toStdString() 返回 std::string,配合 std::format(C++20)可简化日志格式化;
  • 慎用 C++20 modules:目前 Qt 尚未提供 module 接口(.mxx),仍依赖传统头文件包含;
  • 信号槽连接支持 C++17 auto 类型推导和 lambda 捕获,Qt 5.10+ 已优化性能。

不复杂但容易忽略。

相关专题

更多
视频后缀名都有哪些
视频后缀名都有哪些

视频后缀名都有avi、mpg、mpeg、rm、rmvb、flv、wmv、mov、mkv、ASF、M1V、M2V、MPE、QT、VOB、RA、RMJ、RMS、RAM、等等。更多关于视频后缀名的相关知识,详情请看本专题下面的文章,php中文网欢迎大家前来学习。

3390

2023.10.31

C++ Qt图形开发
C++ Qt图形开发

本专题专注于 C++ Qt框架在图形界面开发中的应用,系统讲解窗口设计、信号与槽机制、界面布局、事件处理、数据库连接与跨平台打包等核心技能,通过多个桌面应用项目实战,帮助学员快速掌握 Qt 框架并独立完成跨平台GUI软件的开发。

68

2025.08.15

C++ 图形界面开发基础(Qt方向)
C++ 图形界面开发基础(Qt方向)

本专题系统讲解 使用 C++ 与 Qt 进行图形界面(GUI)开发的核心技能,内容涵盖 Qt 项目结构、窗口组件、信号与槽机制、事件处理、布局管理、资源管理,以及跨平台编译与打包流程。通过多个小型桌面应用实战案例,帮助学习者掌握从界面设计到功能实现的完整 GUI 开发能力。

51

2025.12.05

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

314

2023.08.02

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

617

2023.07.31

python中的format是什么意思
python中的format是什么意思

python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

429

2024.06.27

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

520

2023.09.20

lambda表达式
lambda表达式

Lambda表达式是一种匿名函数的简洁表示方式,它可以在需要函数作为参数的地方使用,并提供了一种更简洁、更灵活的编码方式,其语法为“lambda 参数列表: 表达式”,参数列表是函数的参数,可以包含一个或多个参数,用逗号分隔,表达式是函数的执行体,用于定义函数的具体操作。本专题为大家提供lambda表达式相关的文章、下载、课程内容,供大家免费下载体验。

202

2023.09.15

PPT动态图表制作教程大全
PPT动态图表制作教程大全

本专题整合了PPT动态图表制作相关教程,阅读专题下面的文章了解更多详细内容。

12

2026.01.07

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 6.7万人学习

Git 教程
Git 教程

共21课时 | 2.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号