【发布时间】:2016-03-26 00:24:17
【问题描述】:
我想知道将CMake 用于特定项目而不是qmake 的原因,反之亦然。
这两种构建系统的优缺点是什么?
【问题讨论】:
我想知道将CMake 用于特定项目而不是qmake 的原因,反之亦然。
这两种构建系统的优缺点是什么?
【问题讨论】:
两者都是构建系统,但它们根本不是很相似。如果您的项目使用 Qt,您可能最好使用 qmake。 CMake 更通用,几乎适合任何类型的项目。
qmake 和 CMake 都生成一个Makefile,make 读取它来构建项目。并非所有构建系统都会生成 Makefile,但很多都会生成。甚至 Makefile 也是一种构建系统;它告诉编译器和链接器要做什么,以创建可执行文件(或动态或静态库)。
如果你的项目使用了 Qt,但你不想使用 qmake,你将不得不自己做更多的事情:
因此,您需要做更多的工作才能在没有 qmake 的情况下构建 Qt 项目,但这是可能的,它会教您很多关于 Qt 和 qmake 如何做事的知识。
就个人而言(仅将此作为建议,自己做进一步研究):我不是 qmake 的忠实粉丝。它可以帮助您处理 Qt 的东西,但除此之外,我发现它非常有限。
无论如何,我建议学习构建一个小项目(大约 10 个源文件),而不使用任何类型的构建系统。不使用 CMake,不使用 Makefile,直接使用编译器和链接器。您实际上不应该以这种方式构建任何真正的项目,但您应该学习如何去做,只是为了了解构建系统的实际作用。了解它们的功能将使它们更易于使用。
几个月前,我们把一个项目从qmake切换到Premake,也值得一看。它是高度可编写脚本的(使用 Lua),这在您需要自定义构建过程时非常有用。
也就是说,它有点“手动”,因此请准备好在不使用构建系统的情况下从更基本的层面了解编译和链接的工作原理。它也处于测试阶段(Premake 5),所以仍然缺少一些零碎的东西。
你也可以看看qbs,应该是比较好的qmake。它仍处于测试阶段,所以我会等待它成熟并变得更易于使用。
【讨论】:
CMake 是迄今为止功能更强大的构建系统。委婉地说,语法“不太好”。但是,对于任何复杂的项目,使用 QMake(或我知道的任何构建系统)来实现目标也不是很好。不过对于简单的项目,QMake 更好看。
如果您需要对 Qt 以外的第三方依赖项进行配置检查,CMake 就是您想要的,QMake 中对配置检查的支持很少甚至不存在。
另一方面,QMake 与 Qt Creator 配合使用效果很好(那里缺乏对 CMake 的支持,尽管可以将 CMake 与 Creator 一起使用)。
如果您想在 Qt Creator 中为 iOS 和 Android 构建和部署,我强烈建议您使用 QMake。 (不确定现在是否有可能使用 CMake - 这肯定会引起更多的头痛)。
【讨论】:
我在我的 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 将帮助您为许多构建系统生成配置文件(“构建系统”在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……Visual Studio 更加强大和直观……但这只是我的看法)。
确实,qmake 比CMake 更容易编译基于 Qt 的应用程序(因为 MOC、.ui 和对 Qt 的喜爱是本机支持的)。但无论如何使用CMake 是可行的(有用于Qt 集成的内置函数)。在迁移到 Qt 的新版本时,可能只需要对您的 CMakeLists.txt 进行一些修改(我从 Qt4 迁移到 Qt5 时遇到了困难,我想使用 qmake 会更容易)。
个人而言,我使用CMake 作为我的构建环境,当我需要使用QtCreator(主要用于Android 部署)时,我让我的CMake 脚本为qmake/QtCreator 生成一个.pro 文件。它运行良好,因为qmake .pro 文件语法非常简单。这样我就不会被锁定到特定的 IDE。
【讨论】:
qmake
CMake
我的建议:如果 QtCreator 是您的 IDE,并且您从 Qt 或 C++ 开始,请使用 qmake。如果您想在构建中做任何复杂的事情,请使用 cmake。
qmake 和 CMake 的工作方式相似。有关从 qmake 迁移到 CMake 的教程,请参阅 http://www.th-thielemann.de/development/cmake/cmake_qmake_to_cmake.html。
【讨论】: