news 2026/6/24 0:03:22

qt为什么转向用cmake放弃qmake

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
qt为什么转向用cmake放弃qmake

Qt 从qmake转向CMake是其构建系统战略的重大转型,这一转变在Qt6 中全面落地。下面从技术、生态、工程实践三个维度,系统解释:


一、Qt 使用 CMake 的核心好处

1.强大的跨平台与多编译器支持
  • CMake 原生支持:
    • Windows(MSVC、MinGW)
    • Linux(GCC、Clang)
    • macOS(Clang/Xcode)
    • Android、iOS、嵌入式(QNX、INTEGRITY)
  • 自动适配不同平台的构建工具链(Ninja、MSBuild、Xcode 等)

💡 qmake 对非 Qt 项目的平台支持弱,且难以扩展。


2.无缝集成第三方库
  • 通过find_package()FetchContentVCPKGConan等方式轻松引入外部依赖。
  • 示例:集成 OpenCV、SQLite、Protobuf 等只需几行代码:
    1. find_package(OpenCV REQUIRED)

    2. target_link_libraries(myapp PRIVATE ${OpenCV_LIBS})

❌ qmake 需手动写.pri文件或硬编码路径,维护成本高。


3.现代 C++ 工程标准
  • CMake 是C++ 社区事实标准(被 Google、Microsoft、NVIDIA 等广泛采用)
  • 支持:
    • C++ 标准版本控制(CXX_STANDARD 17/20
    • 编译选项精细控制(警告、优化、宏定义)
    • 并行构建(Ninja 后端速度极快)

4.完整的开发生命周期支持
功能CMake 支持qmake 支持
单元测试(CTest)✅ 原生集成❌ 需手动脚本
安装与打包(install)install()命令⚠️ 有限支持
生成 IDE 项目文件✅ VS/Xcode/CLion 等⚠️ 仅部分支持
静态分析/CI/CD✅ 天然契合❌ 困难

5.更好的模块化与可维护性
  • CMake 支持add_subdirectory()实现多模块项目
  • 可编写可复用的 CMake 模块(.cmake文件)
  • 逻辑清晰,易于团队协作

📌 qmake 的.pro文件在大型项目中容易变得混乱(“面条式配置”)


二、Qt 为什么放弃 qmake?

1.qmake 的设计局限性
  • 语法简单但功能弱:缺乏条件逻辑、函数、作用域等编程能力
  • 扩展性差:无法轻松支持新平台或新工具链
  • 非标准:只有 Qt 项目使用,社区生态孤立

📝 官方评价(Qt 公司博客):
“qmake has served us well, but it’s reached its limits in terms of scalability and maintainability.”


2.Qt 自研构建系统 qbs 的失败
  • Qt 曾尝试推出qbs(基于 JavaScript 的构建系统)
  • 但因:
    • 学习曲线陡峭
    • 社区接受度低
    • 维护成本高
  • 最终于2019 年宣布停止开发

⏪ 这迫使 Qt 必须选择一个已有强大生态的构建系统→ CMake 成为唯一合理选择。


3.行业趋势倒逼
  • 主流 C++ 项目(如 LLVM、VTK、OpenCV)全部使用 CMake
  • 开发者期望“一套构建系统走天下”
  • Visual Studio、CLion、VS Code 等 IDE 对 CMake 原生支持远超 qmake

📊 数据:GitHub 上 CMake 项目数量是 qmake 的100 倍以上


4.Qt 自身架构演进需求
  • Qt6 强调模块化、轻量化、云原生
  • 需要更灵活的构建系统来:
    • 按需编译子模块
    • 支持 WebAssembly、Android AAR 等新目标
    • 与 Conan/VCPKG 等现代包管理器集成

❌ qmake 无法满足这些现代工程需求。


三、qmake vs CMake 关键对比

特性qmakeCMake
语言自定义.pro语法CMake 脚本语言(类 DSL)
跨平台有限(主要为 Qt 服务)极强(全平台)
第三方库集成困难简单(find_package
社区生态Qt 专属全 C++ 社区
IDE 支持Qt Creator 为主VS / Xcode / CLion / Qt Creator 全支持
未来前景❌ 已弃用(Qt6 不推荐)✅ Qt 官方主推

📌 Qt 官方明确表示:qmake 在 Qt6 中仅用于维护旧项目,新项目必须用 CMake


四、对开发者的建议

  • 新项目:直接使用CMake + Qt6
  • 旧项目迁移
    • 小项目:手动重写CMakeLists.txt
    • 大项目:使用工具辅助(如qmake2cmake脚本,但需人工校验)
  • 学习重点
    • 掌握find_package(Qt6 ...)
    • 理解AUTOMOC/AUTOUIC/AUTORCC
    • 学会使用qt_add_executable()(Qt6.3+ 新封装)

✅ 总结

Qt 转向 CMake 不是“折腾”,而是“进化”

  • 对 Qt 公司:降低维护成本,拥抱开源生态
  • 对开发者:获得更强大、更标准、更未来的构建体验

虽然 CMake 初学曲线略陡,但它是现代 C++ 开发的必备技能,投资回报极高。

五、qmake 是什么?

  • qmake是 Qt 自 2002 年起随 Qt 3 引入的专用构建系统
  • 核心功能:读取.pro文件,生成 Makefile(Linux/macOS)或 Visual Studio 项目(Windows)。
  • 优点
    • 简单易用(几行代码就能编译 Qt 项目)
    • 自动处理 MOC/UIC/RCC
    • 与 Qt Creator 深度集成
  • 缺点
    • 语法简陋,缺乏编程能力(无函数、作用域、复杂逻辑)
    • 扩展性差(难以支持新平台或非 Qt 依赖)
    • 仅适用于 Qt 项目,生态封闭

📌 qmake 本质是一个“为 Qt 量身定制的轻量级构建生成器”。

六、为什么 Qt 要推出 qbs?(动机)

大约在2011–2013 年,Qt 团队意识到 qmake 已无法满足现代 C++ 项目的复杂需求,于是启动了qbs项目。

✅ qbs 的设计目标:
目标说明
统一构建流程不再生成中间文件(如 Makefile),而是直接调用编译器,实现“声明式构建”
高性能基于增量构建和智能缓存,比 qmake + make 更快
跨平台原生支持内置对 MSVC、GCC、Clang、Xcode 等的支持,无需生成中间项目文件
现代语言特性使用类似 JavaScript 的脚本语言(基于 QtScript),支持函数、模块、条件逻辑
脱离 Make 依赖在 Windows 上不再依赖 MinGW/MSYS,纯原生构建

💡 qbs 的口号是:“Build once, run anywhere — without Makefiles.”


七、qbs 和 qmake 的关系

维度qmakeqbs
定位轻量级项目生成器完整的构建执行引擎
工作方式生成 Makefile / .vcxproj → 调用 make/msbuild直接解析项目文件 → 调用编译器(无中间文件)
配置语言自定义.pro语法(简单但弱)JavaScript-like 脚本(.qbs文件,更强大)
依赖管理手动指定路径支持模块化依赖和自动查找
与 Qt 集成深度绑定同样深度绑定,但更灵活

🔄qbs 不是 qmake 的升级版,而是一个全新设计的替代品


八、qbs 为何失败?

尽管技术先进,qbs 最终在2019 年被 Qt 官方宣布停止开发。原因如下:

1.社区接受度极低
  • 开发者已习惯 CMake/qmake
  • 学习新语法成本高(“又一个 DSL”)
  • 缺乏第三方库支持(没人写.qbs配置)
2.CMake 的崛起
  • CMake 在 2010 年代后期迅速成为C++ 构建事实标准
  • Google、Microsoft、NVIDIA 等大厂全面采用
  • CMake 3.0+ 引入target_*命令后,现代 CMake 语法清晰且强大
3.维护成本过高
  • Qt 团队需同时维护 qmake、qbs、CMake 支持
  • 资源有限,不如聚焦一个主流方案
4.IDE 支持不足
  • 除 Qt Creator 外,其他 IDE(VS、CLion)对 qbs 几乎无支持
  • 而 CMake 被所有主流 IDE 原生支持

📝 Qt 官方博客(2018)坦言:
“While qbs has some technical advantages, the ecosystem has clearly chosen CMake.”


九、Qt 的最终选择:拥抱 CMake

  • 2016 年:Qt 5.7 开始实验性支持 CMake
  • 2018 年:Qt 5.12 提供完整 CMake 支持
  • 2020 年:Qt 6.0默认使用 CMake,qmake 降级为兼容模式
  • 2019 年:正式宣布停止 qbs 开发

✅ 这标志着 Qt 彻底放弃“自研构建系统”,转而融入 C++ 主流生态。


三者关系总结

  1. qmake (2002)

  2. └── 简单但局限 → 无法满足现代需求

  3. qbs (2013)

  4. └── 技术先进但生态失败 → 被社区抛弃

  5. CMake (2020+)

  6. └── 行业标准 → Qt 全面拥抱


对开发者的启示

  • 不要重复造轮子:即使技术更优,若脱离生态,难逃失败
  • 顺应行业趋势:CMake 已成为 C++ 构建的“普通话”
  • Qt 的务实转型:从“自给自足”转向“融入生态”,是成熟开源项目的标志

✅ 总结

问题答案
qbs 是什么?Qt 推出的新一代构建系统,试图替代 qmake
qbs 和 qmake 关系?qbs 是 qmake 的“精神继任者”,但架构完全不同
为什么推 qbs?qmake 功能不足,Qt 想要更强大、更快、更现代的构建工具
为什么放弃 qbs?社区不买账,CMake 成为主流,维护成本太高
现在该用什么?CMake—— Qt 官方唯一推荐的新项目构建系统

如今,qbs 已成为 Qt 历史中的一个“技术理想主义”案例,而 CMake 则是现实的最佳选择。

qt为什么转向用cmake放弃qmake_qt现在还支持cmake了么?-CSDN博客

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/23 18:30:23

智能零碳管理系统功能与实现

智能零碳管理系统旨在帮助企业有效管理和监控其碳排放,同时为公众用户提供有用的碳排放信息和咨询服务。本文将详细介绍该系统的功能模块与Django模型代码的实现。一、系统角色与权限总结 1. 管理员 审核企业碳排放数据(可设置不合格提醒) 发…

作者头像 李华
网站建设 2026/6/23 21:33:30

你是否正在经历这些知识管理的 “隐形内耗”?​

技术文档散落在语雀、GitHub、本地硬盘,新员工入职像 “寻宝”;写一份部署手册要熬 4 小时,修改迭代还要跨平台同步;搜索 “token 过期解决方案”,返回几十篇无关文档,翻半天找不到重点;敏感数据…

作者头像 李华
网站建设 2026/6/23 1:37:24

快速排序(Quick Sort)的“死穴”

快速排序(Quick Sort)的“死穴”,也就是它的最坏情况。简单来说,它的意思是:如果你运气不好,选的基准值(Pivot)太极端,快速排序就会变得非常慢,慢得像冒泡排序…

作者头像 李华
网站建设 2026/6/13 13:20:39

25、技术探索:Google App Engine、Zenoss与Python包管理

技术探索:Google App Engine、Zenoss与Python包管理 一、Google App Engine数据查询与路由 在Google App Engine开发中,数据查询与路由是重要的环节。以下是一段用于从数据存储中获取最后10条记录并进行处理的代码: collection = [] #grab last 10 records from datasto…

作者头像 李华
网站建设 2026/6/23 22:02:55

每日一练:流星雨

题目描述贝西听说一场非凡的流星雨即将来临;报告称这些流星将撞击地球并摧毁它们所碰到的任何东西。为了安全,她发誓要找到一个安全的位置(一个从未被流星摧毁的地方)。她目前在坐标平面的原点放牧,想要移动到一个新的…

作者头像 李华
网站建设 2026/6/20 5:16:44

21、SNMP网络管理与数据中心发现实战

SNMP网络管理与数据中心发现实战 1. 配置Net - SNMP 当你要在想要监控的客户端上安装Net - SNMP时,应使用主机资源MIB(Management Information Base,管理信息库)来编译Net - SNMP。具体操作步骤如下: ./configure -with-mib-modules=host运行 configure 时,它会尝试…

作者头像 李华