如何在Qt subdir项目中设置构建顺序

the*_*ean 18 qt build-process qmake build

我有一个包含5-6个库和一个可执行文件的项目.可执行文件取决于库,某些库依赖于其他库.如何指定构建顺序,以便在需要之前构建依赖项?

use*_*573 33

虽然很久以前这个问题已得到回答和接受,但我觉得有必要再加上一个答案; 老实说,我认为有一个更好的答案.

我认为CONFIG += ordered有害和坏习惯.这可能是qmake开发人员过早介绍的东西.它的使用有很强的反对意见.缺点是这些:

  1. 没有定义依赖项,它只是命名构建顺序
  2. 它会破坏多核构建时间
  1. 它阻止了Qt开发人员实现有意义的功能

因此,我建议您更改项目文件,如下所示:

TEMPLATE = subdirs

SUBDIRS += Utility GraphicModule PackingLib Core GameProto

GameProto.depends = Core
Core.depends = PackingLib
PackingLib.depends = GraphicModule
GraphicModule.depends = Utility
Run Code Online (Sandbox Code Playgroud)

这种方式明确定义了依赖关系.您还可以考虑其他更复杂的依赖层次结构,这种层次结构可能采用这种方式,而且构建顺序绝对不可能.


更新:(2017年6月21日)

不幸的是,qmake当涉及具有深层子项目层次结构的大型项目时,它不是最好的工具.大型项目出现的问题是:

  • 无法为层次结构中较高的子项目定义依赖项
  • Run qmake 需要很长时间才能执行
  • 编译时间长,因为没有正确处理依赖项,执行了太多不必要的编译步骤
  • 有时qmake无法正确计算子项目依赖项,这使得必须单独编译子项目

解决这些问题主要有两种方法:

  • 将项目重写为平面层次结构.所有可执行文件,静态和动态库都应该在最顶层.仅对您绝对无法避免的子项目使用两个或更多级别.(例如,包含静态库的动态库)这将导致更短的qmake运行时间和更短的编译时间.但是,即使这种方法有时也会失败.
  • 更改为其他制作工具,例如cmake.认真.Cmake是一个成熟的产品,Qt Creator内部的支持可与之相媲美qmake.

评论:

由于众所周知的问题qmake,Qt公司已经决定推出一种新的制造工具QBS.但是,使用此工具并不像第一次展示时那样简单.有没有简单的过渡,从qmakeQBS,尤其是对于更复杂的项目.类似Javascript的QBS语言语法不易掌握,文档很少.

恕我直言,只有两种其他工具可供替换qmake:

  • CMake,众所周知的构建工具.
  • meson,一个开源构建系统意味着非常快,更重要的是,尽可能用户友好.


the*_*ean 10

好.我找到了解决方案.只需将订购添加到CONFIG并按正确的顺序记录子目录

CONFIG += ordered

SUBDIRS += Utility GraphicModule PackingLib Core GameProto
Run Code Online (Sandbox Code Playgroud)

对我来说这个工作很好

  • 'CONFIG + = ordered'会对多核编译时产生破坏性影响.请考虑严格定义依赖关系,如下面的答案所示. (3认同)