qt - 如何在 Qt 子目录项目中设置构建顺序

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

最佳答案

更新:(2021 年 2 月)

  • 2018 年 10 月 - Qt decided to deprecate Qbs并重定向其资源以增加对 CMake 的支持。
  • 2020 年 10 月 - CMake is the build system for Qt 6 .

请根据此新信息使用以下(旧)答案中的建议。


虽然这个问题很久以前就已经回答并接受了,但我觉得有必要再补充一个答案;老实说,我认为有更好的答案。

我认为 CONFIG += ordered 有害且是一个坏习惯。这可能是 qmake 开发人员过早引入的东西。还有strong opponents到它的用途。缺点是:

  1. 定义依赖关系,它只是命名构建顺序
  2. 它缩短了多核构建时间
  3. 它会阻止 Qt 开发人员 implementing meaningful features

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

TEMPLATE = subdirs

SUBDIRS += Utility GraphicModule PackingLib Core GameProto

GameProto.depends = Core
Core.depends = PackingLib
PackingLib.depends = GraphicModule
GraphicModule.depends = Utility

这样就可以清楚地定义依赖关系。您还可以考虑其他更复杂的依赖层次结构,这些依赖层次结构可以通过这种方式实现,而构建顺序则绝对不可能。

不幸的是,qmake 在涉及具有较深子项目层次结构的大型项目时并不是最好的工具。大型项目的问题如下:

  • 无法为层次结构中较高的子项目定义依赖关系
  • 运行 qmake 执行时间非常长
  • 编译时间长,因为没有正确处理依赖项并且执行了太多不必要的编译步骤
  • 有时qmake无法正确计算子项目的依赖关系,需要单独编译子项目

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

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

由于 qmake 的众所周知的问题,Qt 公司已经决定引入一个新的 make 工具 QBS。然而,这个工具的使用并不像第一印象那样简单。从 qmakeQBS 的过渡并不容易,尤其是对于更复杂的项目。 QBS 语言的类 Javascript 语法不易掌握,文档稀缺。

恕我直言,只有两个其他工具可以替代 qmake:

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

https://stackoverflow.com/questions/11079398/

相关文章:

.net - MSBuild - 如何从预先编写的命令行命令构建 .NET 解决方案文件(在 XML

c++ - 如何为新安装的 Boost 添加编译器包含路径和链接器库路径?

ios - xcode 5存档构建失败,但正常构建成功

java - java文件中的Maven版本号

java - 在 Maven 测试阶段禁用 Log4J 日志

c# - 在分支之间转换时生成错误 : Your project is not referencin

build - EA 在 Java 版本中代表什么?

build - CMake将非编译文件导入构建目录

java - 有没有使用 maven 运行可执行 jar 的好方法?

java - 如何让 Java maven 构建因编译器警告而失败?