我有一个包含 5-6 个库和一个可执行文件的项目。可执行文件依赖于库,并且某些库依赖于其他库。如何指定构建顺序,以便在需要依赖项之前构建依赖项?
Update:(2021 年 2 月)
- 2018 年 10 月 -Qt 决定弃用 Qbs https://www.qt.io/blog/2018/10/29/deprecation-of-qbs并重定向其资源以增加对 CMake 的支持。
- 2020 年 10 月 -CMake 是 Qt 6 的构建系统 https://www.qt.io/blog/qt-6-build-system.
请根据这一新信息采纳下面(旧)答案中的建议。
虽然这个问题很早以前就已经被回答和接受了,但我觉得有必要补充一个答案;老实说,我认为有更好的答案。
我认为CONFIG += ordered
有害的和坏习惯。这可能是 qmake 开发人员引入的有点过早。还有强大的对手 http://blog.rburchell.com/2013/10/every-time-you-configordered-kitten-dies.html到它的使用。缺点是:
- it does not定义依赖关系,它只是命名构建顺序
- 它缩短了多核构建时间
- 它阻止 Qt 开发人员实现有意义的功能 https://bugreports.qt.io/browse/QTCREATORBUG-8349
因此,我建议按如下方式更改您的项目文件:
TEMPLATE = subdirs
SUBDIRS += Utility GraphicModule PackingLib Core GameProto
GameProto.depends = Core
Core.depends = PackingLib
PackingLib.depends = GraphicModule
GraphicModule.depends = Utility
这样就可以清楚地定义依赖关系。您还可以考虑其他更复杂的依赖层次结构,这种方式是可能的,但按照构建顺序是绝对不可能的。
很遗憾,qmake
当涉及具有深层子项目层次结构的大型项目时,这并不是最好的工具。大型项目存在的问题如下:
- 无法定义对层次结构中更高层子项目的依赖关系
-
Run qmake
需要很长时间才能执行
- 编译时间长,因为依赖关系没有得到正确处理并且执行了太多不必要的编译步骤
- 有时
qmake
无法正确计算子项目依赖关系,因此需要单独编译子项目
解决这些问题主要有两种方法:
- 将您的项目重写为平面层次结构。所有可执行文件、静态和动态库都应该位于最顶层。仅对绝对无法避免的子项目使用两个或多个级别。 (例如,由静态库组成的动态库)这将导致更短的时间
qmake
运行时间和更短的编译时间。然而,即使这种方法有时也可能会失败。
- 更改为不同的制作工具,例如
cmake
。严重地。Cmake
是一个成熟的产品,Qt Creator 内部的支持可与qmake
.
由于众所周知的问题qmake
,Qt公司已经决定推出新的make工具QBS
。然而,这个工具的使用并不像第一印象中那么简单。没有简单的过渡qmake
to QBS
,特别是对于更复杂的项目。类似于 Javascript 的语法QBS
语言不容易掌握,文档也很少。
恕我直言,只有两种其他工具可以替代qmake
:
-
CMake https://cmake.org/,众所周知的构建工具。
-
meson http://mesonbuild.com/,一个开源构建系统,不仅速度极快,而且更重要的是,尽可能用户友好。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)