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

时间:2012-06-18 08:39:51

标签: qt build build-process qmake

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

2 个答案:

答案 0 :(得分:29)

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

我认为CONFIG += ordered是有害的,也是一种坏习惯。这可能是qmake开发人员过早介绍的东西。它的使用有strong opponents。缺点是:

  1. 定义依赖项,它只是命名构建顺序
  2. 它可以简化多核构建时间
  3.   
        
    1. 它阻止Qt开发人员implementing meaningful features
    2.   

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

    TEMPLATE = subdirs
    
    SUBDIRS += Utility GraphicModule PackingLib Core GameProto
    
    GameProto.depends = Core
    Core.depends = PackingLib
    PackingLib.depends = GraphicModule
    GraphicModule.depends = Utility
    

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

    更新:(2017年6月21日)

    不幸的是,qmake并不是具有深层子项目层次结构的大型项目的最佳工具。较大项目出现的问题是:

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

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

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

    <强>注释:

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

    恕我直言中只有两种其他可用的工具可以取代qmake

    • CMake,众所周知的构建工具。
    • meson,一个开源构建系统,意味着速度极快,更重要的是,尽可能方便用户使用。

答案 1 :(得分:9)

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

CONFIG += ordered

SUBDIRS += Utility GraphicModule PackingLib Core GameProto

对我来说,这项工作很好