CMake和qmake之间有什么区别和相似之处?

时间:2015-12-19 11:18:24

标签: c++ qt cmake qmake

我想知道使用CMake为qmake的特定项目的原因,反之亦然

两种构建系统的优点和缺点是什么?我搜索并找到了一些文件,但感觉很难理解。

5 个答案:

答案 0 :(得分:29)

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

qmake和CMake都会生成一个Makefile,由make读取以构建项目。并非所有构建系统都生成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。它还处于测试阶段,因此我会等待它成熟并变得更容易使用。

答案 1 :(得分:19)

CMake是迄今为止功能更强大的构建系统。语法是"不太好"说得客气一点。但是,对于任何复杂的项目,与QMake(或我所知道的任何构建系统)有什么关系来实现的东西也不是很好。对于简单的项目,QMake虽然看起来更好。

如果你需要配置除Qt之外的第三方依赖项的配置检查,CMake就是你想要的,对QMake中的配置检查的支持是最小的,不存在。

另一方面,QMake在Qt Creator中表现很好(缺少CMake支持,尽管可以将CMake与Creator一起使用)。

如果您想在Qt Creator中为iOS和Android构建和部署,我强烈建议使用QMake。 (不确定这些日子是否可能与CMake一起使用 - 这肯定会引起更多麻烦)。

答案 2 :(得分:10)

我将CMake用于我的Qt项目,并对此非常满意。具体来说,我在我的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,我希望这会有所帮助。

答案 3 :(得分:7)

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

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

据我所知,

qmake只支持QtCreator作为IDE(在后台使用第三方编译器:在Visual Studio中使用nmake,g ++,MinGW ......)。但是您不会使用qmake生成Visual Studio解决方案(sln文件)。这是我在qmake中看到的主要限制(因为我讨厌QtCreator ...... Visual Studio更强大,更直观......但这只是我的观点)。

这是真的qmake使得编译基于Qt的应用程序(因为MOC,.ui和对Qt的喜爱是原生支持的)比CMake更容易。但是无论如何使用CMake(Qt集成的内置函数)都是可行的。移动到Qt的新版本时,只有你的CMakeLists.txt可能需要重做一点(从Qt4转到Qt5我很难,我想使用qmake会使这更容易)。

Personnaly,我使​​用CMake作为构建环境,当我需要使用QtCreator(主要用于Android部署)时,我使CMake脚本为qmake / QtCreator生成.pro文件。它运行良好,因为qmake .pro文件语法非常简单。然后我没有被锁定到特定的IDE。

答案 4 :(得分: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