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了么?-优快云博客

<think>嗯,用户问的是Qt项目创建中CMakeQMake的区别。我需要先回忆这两个工具的基本信息。QMakeQt自家传统的构建系统,而CMake是更通用的,后来被Qt支持的。 首先,得说明它们各自的背景。QMakeQt专门为自身设计的,处理.pro文件,语法相对简单。CMake则是跨平台的开源工具,用CMakeLists.txt,功能更强大,适用于复杂项目。 接下来,区别方面应该分点讲。比如历史背景、语法差异、功能扩展性、社区支持等。用户可能关心迁移的难易,或者哪个更适合新项目。需要提到Qt6开始推荐CMake,这可能影响用户的选择。 还要注意用户的使用场景。如果是新项目,尤其是打算跨平台或有其他依赖库,CMake可能更合适。如果是维护旧项目,QMake更直接。可能用户不太清楚迁移的必要性,得解释清楚优缺点。 另外,需要给出实际选择的建议,比如项目规模、团队熟悉度、是否需要非Qt库等因素。可能用户需要指导如何做决定,所以例子会有帮助,比如简单应用用QMake,复杂用CMake。 最后,确保回答结构清晰,分点明确,用中文口语化,避免技术术语堆砌。检查是否有遗漏,比如CMake的find_package和QMake的配置方式不同,或者自动化生成工具如qmakecmake命令的使用差异。确保信息准确,比如Qt6默认支持CMake的情况是否正确。</think>在Qt项目创建中选择CMakeQMake时,主要区别体现在以下几个方面: 📌 **一、背景定位** 1. **QMake**:Qt官方早期专用构建工具 - 专为Qt设计,深度集成Qt特性(如自动处理`.ui`/`.qrc`文件) - 使用`.pro`项目文件,语法简单(`QT += widgets`) 2. **CMake**:跨平台通用构建系统 - 支持Qt、OpenCV等多种框架(需手动配置Qt模块) - 使用`CMakeLists.txt`,采用脚本式语法 ⚙️ **二、核心差异对比** | 特性 | QMake | CMake | |---------------------|--------------------------------|--------------------------------| | 语法复杂度 | 简单直观 | 更复杂但灵活 | | 跨平台支持 | 依赖Qt环境 | 原生支持所有主流平台 | | 依赖管理 | 主要针对Qt模块 | 支持find_package()查找任意库 | | 生成目标 | 主要生成Makefile | 可生成VS/Xcode/Ninja等多种工程| | 学习曲线 | 较平缓 | 陡峭但应用广泛 | 🔧 **三、典型配置对比** ```cmake # CMake示例 cmake_minimum_required(VERSION 3.16) project(MyApp) find_package(Qt6 COMPONENTS Core Widgets REQUIRED) add_executable(app main.cpp) target_link_libraries(app Qt6::Core Qt6::Widgets) ``` ```qmake # QMake示例 QT += core widgets TARGET = MyApp SOURCES += main.cpp ``` 🚀 **四、选择建议** 1. **优先选CMake**的场景: - 新项目(特别是Qt6+) - 需要集成非Qt库(如OpenCV) - 多构建系统支持需求 - 大型复杂项目(支持模块化配置) 2. **考虑QMake**的情况: - 维护旧Qt项目(Qt5及更早) - 简单小程序开发 - 团队熟悉Qt特有工作流 💡 **五、迁移注意事项** - Qt6已默认推荐CMake - 混合项目可通过`qmake2cmake`工具转换 - CMake需要显式指定模块(如`find_package(Qt6 COMPONENTS Charts)`) 建议根据项目复杂度和团队技术栈选择。新项目推荐从CMake入手以适应现代C++开发趋势,既有QMake项目可逐步迁移。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值