【问题标题】:What are CMake vs qmake pros and cons?CMake 与 qmake 的优缺点是什么?
【发布时间】:2016-03-26 00:24:17
【问题描述】:

我想知道CMake 用于特定项目而不是qmake 的原因,反之亦然

这两种构建系统的优缺点是什么?

【问题讨论】:

    标签: qt cmake qmake


    【解决方案1】:

    两者都是构建系统,但它们根本不是很相似。如果您的项目使用 Qt,您可能最好使用 qmake。 CMake 更通用,几乎适合任何类型的项目。

    qmake 和 CMake 都生成一个Makefilemake 读取它来构建项目。并非所有构建系统都会生成 Makefile,但很多都会生成。甚至 Makefile 也是一种构建系统;它告诉编译器和链接器要做什么,以创建可执行文件(或动态或静态库)。


    如果你的项目使用了 Qt,但你不想使用 qmake,你将不得不自己做更多的事情:

    • 运行Meta Object Compiler (MOC)
    • 包含路径(告诉编译器在哪里寻找 Qt 头文件)
    • 链接(告诉链接器在哪里寻找 Qt 库)

    因此,您需要做更多的工作才能在没有 qmake 的情况下构建 Qt 项目,但这是可能的,它会教您很多关于 Qt 和 qmake 如何做事的知识。

    就个人而言(仅将此作为建议,自己做进一步研究):我不是 qmake 的忠实粉丝。它可以帮助您处理 Qt 的东西,但除此之外,我发现它非常有限。


    无论如何,我建议学习构建一个小项目(大约 10 个源文件),而不使用任何类型的构建系统。不使用 CMake,不使用 Makefile,直接使用编译器和链接器。您实际上不应该以这种方式构建任何真正的项目,但您应该学习如何去做,只是为了了解构建系统的实际作用。了解它们的功能将使它们更易于使用。


    几个月前,我们把一个项目从qmake切换到Premake,也值得一看。它是高度可编写脚本的(使用 Lua),这在您需要自定义构建过程时非常有用。

    也就是说,它有点“手动”,因此请准备好在不使用构建系统的情况下从更基本的层面了解编译和链接的工作原理。它也处于测试阶段(Premake 5),所以仍然缺少一些零碎的东西。

    你也可以看看qbs,应该是比较好的qmake。它仍处于测试阶段,所以我会等待它成熟并变得更易于使用。

    【讨论】:

    • QMake 不是一个构建系统,它实际上是一个用于生成编译器 make 文件的 premake 系统。
    • Qbs 现在稳定了。文档是可靠的。虽然 Qt 公司不再直接支持它,但它有良好的社区支持并且会定期更新。 QtCreator 支持最新版本的 Qbs,并且往往比 CMake 或 QMake 运行得更快。
    【解决方案2】:

    CMake 是迄今为止功能更强大的构建系统。委婉地说,语法“不太好”。但是,对于任何复杂的项目,使用 QMake(或我知道的任何构建系统)来实现目标也不是很好。不过对于简单的项目,QMake 更好看。

    如果您需要对 Qt 以外的第三方依赖项进行配置检查,CMake 就是您想要的,QMake 中对配置检查的支持很少甚至不存在。

    另一方面,QMake 与 Qt Creator 配合使用效果很好(那里缺乏对 CMake 的支持,尽管可以将 CMake 与 Creator 一起使用)。

    如果您想在 Qt Creator 中为 iOS 和 Android 构建和部署,我强烈建议您使用 QMake。 (不确定现在是否有可能使用 CMake - 这肯定会引起更多的头痛)。

    【讨论】:

      【解决方案3】:

      我在我的 Qt 项目中使用 CMake,我对此非常满意。具体来说,我的 CMakeLists.txt 中有以下内容:

      set(QT_VERSION_REQ "5.2")
      set(CMAKE_INCLUDE_CURRENT_DIR ON)
      find_package(Qt5Core ${QT_VERSION_REQ} REQUIRED)
      find_package(Qt5Quick ${QT_VERSION_REQ} REQUIRED)
      find_package(Qt5Widgets ${QT_VERSION_REQ} REQUIRED)
      find_package(Qt5Gui ${QT_VERSION_REQ} REQUIRED)
      
      set(CMAKE_AUTOMOC ON)
      QT5_WRAP_UI( UI_HDRS ${UI_FILES} )
      
      ADD_EXECUTABLE(${MOC_HEADERS})
      
      target_link_libraries(${PROJECT_NAME}
        Qt5::Core
        Qt5::Quick
        Qt5::Widgets  
        Qt5::Gui  
      )
      

      如果您决定使用 CMake,我希望这会有所帮助。

      【讨论】:

      • 只有我一个人很难接受 Cmake 是用 Python 制作的吗……?一方面,它被称为“C”而不是“Pmake”,但更重要的是,使用的语法非常基础,看起来甚至 CPP 都可以处理大多数。如果没有,那么总是有可怜的 M4 - 字面上是为这些东西制造的。比人们想象的要强大得多,但我想他们都不幸在手册之前偶然发现了 Autoconf 糟糕的语法/api,然后就说见鬼了……:'/
      【解决方案4】:

      CMake 将帮助您为许多构建系统生成配置文件(“构建系统”在CMake 中称为生成器)。见What is a CMake generator?

      这意味着如果您有一组 C/C++ 源代码和编写良好的CMakeLists.txt,您可以使用 CMake 为不同的构建系统(基于命令行的 IDE)创建项目,如 Visual Studio、CodeBlocks、克++... 使用 CMake,您可以选择最终将使用的 IDE 和编译器,并在支持的版本之间“轻松”切换。

      qmake,据我所知,仅支持 QtCreator 作为 IDE(它在后台使用 3rd 方编译器:来自 Visual Studio、g++、MinGW 的 nmake...)。但是您不会使用 qmake 生成 Visual Studio 解决方案(sln 文件)。这是我在 qmake 中看到的主要限制(因为我讨厌 QtCreator……Vis​​ual Studio 更加强大和直观……但这只是我的看法)。

      确实,qmakeCMake 更容易编译基于 Qt 的应用程序(因为 MOC、.ui 和对 Qt 的喜爱是本机支持的)。但无论如何使用CMake 是可行的(有用于Qt 集成的内置函数)。在迁移到 Qt 的新版本时,可能只需要对您的 CMakeLists.txt 进行一些修改(我从 Qt4 迁移到 Qt5 时遇到了困难,我想使用 qmake 会更容易)。

      个人而言,我使用CMake 作为我的构建环境,当我需要使用QtCreator(主要用于Android 部署)时,我让我的CMake 脚本为qmake/QtCreator 生成一个.pro 文件。它运行良好,因为qmake .pro 文件语法非常简单。这样我就不会被锁定到特定的 IDE。

      【讨论】:

      • 'qmake -tp vc' 生成visual studio sln和vcxproj文件
      • 我们知道,OP 想要生成 .pro 文件。
      【解决方案5】:

      qmake

      • 专注于使用 Qt 的项目
      • QtCreator 可以轻松生成项目文件(适合初学者)
      • QtCreator 支持

      CMake

      • 用于广泛的项目
      • 支持多种平台和语言
      • 受多个 IDE 支持:例如QtCreator、Visual Studio
      • 为多个 IDE 生成项目描述
      • 包含使 Qt 的使用变得容易的命令(最重要的是:automoc)

      我的建议:如果 QtCreator 是您的 IDE,并且您从 Qt 或 C++ 开始,请使用 qmake。如果您想在构建中做任何复杂的事情,请使用 cmake。

      qmake 和 CMake 的工作方式相似。有关从 qmake 迁移到 CMake 的教程,请参阅 http://www.th-thielemann.de/development/cmake/cmake_qmake_to_cmake.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-05-12
        • 1970-01-01
        • 2010-10-31
        • 1970-01-01
        • 2011-07-24
        • 2011-06-03
        • 2011-04-02
        相关资源
        最近更新 更多