为什么Qt使用自己的构建工具qmake?

57

我刚开始使用Qt,注意到它使用自己的构建工具qmake

  • 为什么Qt使用自己的构建工具?
  • 有什么特殊情况阻止了它使用标准构建工具吗?
  • qmake是否调用GCCC ++编译器?

24
你误解了,qmake 更像是 configure 的替代品,而不是 make - Evan Teran
1
如果您熟悉Imakefiles,那么qt .pro文件就是它的替代品。qmake会将您的.pro文件转换为Makefile,而不是从Imakefile中生成Makefile。(它也可以为您生成.pro文件,但有时您需要添加默认值。) - Bill
6个回答

58

Qt使用qmake来透明地支持Qt的各种插件,包括“moc,元对象编译器”(提供信号和槽),“uic,UI编译器”(从.ui设计文件创建头文件),“rcc,资源编译器”(编译资源)。

没有任何阻止您使用任何构建系统。然而,这将需要更多的工作。例如,您需要在每个包含具有信号或槽的类的头文件上运行“moc”。一般情况下,不建议这样做,特别是对于刚开始使用Qt的人。

QMake不直接调用g ++ / gcc。相反,qmake在当前平台上创建本地的make文件。在Linux下,它会创建标准的GNU make文件,在Windows下,它可以生成Visual Studio的make文件,在Mac OS X下,它可以生成XCode项目文件。然后,您调用本地的构建系统(无论是GNU make还是MS NMake或xcodebuild等),该构建系统将调用本地的编译器(g ++ / gcc或其他)。


关于“QMake不直接调用g++/gcc”的问题:那么QT并没有使用像gcc这样的标准C++编译器吗?它使用的是哪个编译器? - Trevor Boyd Smith
QT是跨平台的,可以使用许多不同的编译器进行编译。 - Ron Warholic
8
QMake并没有直接调用gcc编译器。它创建特定于平台的make文件,然后让进行调用。这些make文件会进一步调用您所使用的任何编译器。 - Thomi
@Trevor,QMake只是为不同的系统生成makefile和其他构建项目,例如GNU makefile、VC++或XCode项目、NMake makefile等。 - CMircea
1
我认为值得一提的是,除了qmake之外,还有其他工具也可以为您完成所有这些工作(即cmake)。 - Matthias Kuhn

9
在我看来,对于简单的项目,qmake非常棒(你只需要执行qmake -project; qmake; make),但是对于大型项目而言,它不够好且文档不充足。特别是qmake的配置功能很糟糕。
我所知道的最好的构建系统是CMake和Waf(基于Python)。在我的Qt项目中,我使用CMake来完成工作。就像KDE的开发者一样 :)

6
为了支持其信号/槽系统,Qt 依赖于一个特殊的预处理器和编译器,生成大部分处理工作的中间对象。他们称之为元对象编译器(Meta-Object Compiler)或 MOC。
有关详细信息,请参见Qt 5 文档:使用元对象编译器
MOC(以及其他几个中间工具)与 qmake 协同工作;qmake 是一种构建自动化工具,可在本地格式(VC++、g++ 等)中生成 Makefile,用于构建由 MOC 生成的中间文件以及所有源文件到最终可执行文件。

5

qmake旨在实现跨平台和灵活性。它可以与Microsoft Visual Studio和Xcode兼容。

您可以在qmake手册中找到所有相关信息。

qmake根据项目文件中的信息生成Makefile。项目文件由开发人员创建,通常很简单,但对于复杂的项目,可以创建更复杂的项目文件。 qmake包含其他功能,以支持使用Qt进行开发,自动包括moc和uic的构建规则。 qmake还可以为Microsoft Visual studio生成项目,而无需开发人员更改项目文件。


6
所以它不完全是一个构建工具,而是一个预构建工具 ;) - Cecil Has a Name

3

为了

a) 它在幕后为你做了很多事情

b) 是的,参见a)

c) 是的,它确实调用了g++(但如果你有其他编译器,它也可以支持)


1

顺便提一句,这是真的直到Qt 5.x(包括5.x版本)。 现在Qt 6正在转向使用CMake。至少用于构建Qt本身,但似乎可以合理地期望将cmake推荐用于构建Qt应用程序,而不是qmake。特别是因为主要的qmake开发人员不再为Qt公司工作。 终于有一个行业标准工具了,而不是内部工具:-)


你可以在 https://www.kdab.com/qt-and-cmake/ 阅读更多相关内容。 - David Faure
qbs已经停止开发,您可以在https://www.qt.io/blog/2018/10/29/deprecation-of-qbs了解更多信息。 - David Faure
1
我很高兴听到Qt决定停止在已经有1000个构建系统的情况下,将他们非常有限的资源用于创建另一个构建系统:请参见https://xkcd.com/927/。 - Trevor Boyd Smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接