我有一个包含 5-6 个库和一个可执行文件的项目。可执行文件依赖于库,一些库依赖于其他库。如何指定构建顺序,以便在需要之前构建依赖项?
问问题
8804 次
2 回答
34
更新:(2021 年 2 月)
- 2018 年 10 月 - Qt 决定弃用 Qbs并重新定向其资源以增加对 CMake 的支持。
- 2020 年 10 月 - CMake 是 Qt 6 的构建系统。
请根据此新信息使用以下(旧)答案中的建议。
虽然这个问题很久以前就已经回答并接受了,但我觉得有必要再补充一个答案;老实说,我认为有更好的答案。
我认为CONFIG += ordered
有害和坏习惯。这可能是 qmake 开发人员过早引入的东西。并且有强烈的反对者使用它。缺点是这些:
- 它没有定义依赖关系,它只是命名一个构建顺序
- 它缩短了多核构建时间
- 它阻止 Qt 开发人员实现有意义的功能
因此,我建议更改您的项目文件如下:
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
从到的过渡并不容易QBS
,尤其是对于更复杂的项目。该QBS
语言的类 Javascript 语法不易掌握,文档稀缺。
恕我直言,只有两个其他工具可以替换qmake
:
于 2015-04-28T14:46:06.317 回答
10
行。我找到了解决方案。只需将命令添加到 CONFIG 并以正确的顺序背诵子目录
CONFIG += ordered
SUBDIRS += Utility GraphicModule PackingLib Core GameProto
对我来说,这项工作很好
于 2012-06-18T09:59:45.710 回答