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

2024-03-11

我有一个包含 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到它的使用。缺点是:

  1. it does not定义依赖关系,它只是命名构建顺序
  2. 它缩短了多核构建时间
  3. 它阻止 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(使用前将#替换为@)

如何在 Qt 子目录项目中设置构建顺序 的相关文章

  • 在哪里可以找到 QT 5.3.0 命令提示符

    用于学习Qt的书 C gui programming with qt 4 2nd 版 我需要Qt的命令提示符 我已经安装了Qt 5 3 0 creator 5 3 0开源 但不知道它的命令提示符在哪里 有人可以帮助我吗 我认为您正在寻找的是
  • Bazel 构建缺少严格的依赖关系

    我正在尝试使用 brazel 构建 Go 应用程序 它是一个现有的私有 GitHub 存储库 位置如下 github xyz com repo name 我正在研究 我的目标是从 main go 文件创建一个二进制文件 该文件的方法依赖于其
  • 无法将 QList 分配给 QString

    我遇到这个错误 Unable to assign QList
  • 打开和关闭附加窗口 (QML)

    目前我有一个通过以下方式打开的窗口 property variant win Button id testButton MouseArea onClicked var component Qt createComponent test qm
  • QML:无法读取未定义的属性“xxx”

    ApplicationWindow id root property string rootName rootName visible true width 800 height 400 title qsTr WatchFace Maker
  • 仅在内部/外部抚摸路径?

    Given a QPainterPath http qt project org doc qt 4 8 qpainterpath html如何仅在路径的内侧或外侧边缘 或非闭合路径的左侧或右侧 描边路径 QPainter strokePat
  • 如何在 Qt Creator 中编辑 QtWebKit 的右键上下文菜单?

    好吧 这是我的困境 我正在使用 Qt Creator 制作一个使用 Webkit 的简单应用程序 我认为 Qt Creator 会有一种简单的方法来使用信号和槽编辑器编辑右键单击上下文菜单 但事实证明这不是真的 我知道 webkit 有与上
  • 在 QtCreator 中使用 .pro 和 .pri 正确(树)显示 Qt 项目

    是否可以使用项目包含文件 pri 显示不止一个额外级别 例如如果 pro文件包括 pri文件包含两个 pri files pro pri pri pri 在 QtCreator 项目 中显示具有误导性 pro pri pri pri 它根本
  • 如何让小部件在上下文菜单出现时接收鼠标释放事件

    在Ubuntu20 04上 当上下文菜单出现时 我无法让小部件接收鼠标释放事件 而Windows可以接收 我的pyqt版本是5 15 2 我考虑过手动发送鼠标释放事件 但我不知道当上下文菜单出现时哪些系统会收到鼠标释放事件 这样做可能会导致
  • 使用 OpenGL 渲染 QImage

    与我相关的其他问题 https stackoverflow com questions 20126354 render qimage from sooffscreenrenderer in qglwidget 我认为更核心的问题是 如何渲染
  • QML 中可重用的字体属性[重复]

    这个问题在这里已经有答案了 在 QML 中 我希望能够定义一组字体属性以进行简单的语义重用 例如 代替 Text text This is a header font family Encode Sans weight Font Black
  • 如何在 Xcode 构建完成时设置警报?

    我是一名懒惰的 iOS 开发人员 在一个大型 iOS 项目中工作 我已经应用了许多优化来减少项目构建时间 但每次构建都需要超过 10 12 分钟 我开始构建 有时当构建完成时 我会在桌子上睡着 有没有什么方法可以将任何语音 铃声警报与 xc
  • 如何获取 Visual Studio 的“发布”功能以包含生成后事件中的文件?

    我目前正在尝试使用 Visual Studio 2010 发布 和 MSDeploy 功能来处理我的 Web 部署需求 但在根据我的构建配置自定义包方面遇到了障碍 我在 32 位环境中开发 但需要为 64 位环境创建发布包 因此在 发布 配
  • 如何在 Qt 应用程序中嵌入 Python 解释器?

    有没有一种简单的方法可以将 Python 解释器嵌入到 Qt 应用程序中 如果可能的话 我希望有一个跨平台的解决方案 这就是目的PythonQt http pythonqt sourceforge net 它支持 Windows Linux
  • 无法使用新的 TfvcTemplate.12.xaml 进行构建

    我尝试将新模板 TfvcTemplate 12 xaml 与我的构建 Vs 2013 一起使用 但每次我收到以下错误消息 TF215097 An error occurred while initializing a build for b
  • PyQt4 信号和槽

    我正在使用 PyQt4 编写我的第一个 Python 应用程序 我有一个 MainWindow 和一个 Dialog 类 它是 MainWindow 类的一部分 self loginDialog LoginDialog 我使用插槽和信号 这
  • Github 操作测试之前是否进行了包含特定单词的提交

    我需要确保使用 github 操作进行测试 如果之前已进行包含该单词的提交build 如果提交不包含单词build那么不应运行 github 操作的测试 你能给我一些建议吗 Test name Testing on push branche
  • Qt(在 Windows 上)将权限级别设置为“requireAdministrator”

    我正在使用 Qt Creator 并努力制作 exe文件默认以管理员身份运行 在线阅读所有解决方案我试图将这一行放入我的 pro file QMAKE LFLAGS MANIFESTUAC level requireAdministrato
  • QTabWidget 选项卡在垂直方向,但文本在水平方向

    我正在尝试用 C Qt 制作一个带有这样的侧边栏的应用程序 但是当将 QTabWidget 方向设置为西时 它会使文本垂直 如何让文本位于左侧 但水平对齐 PS 我不需要图标 提前致谢 您可以使用QListWidget http doc q
  • QML 列表视图拖放

    我想创建两个 qml 列表视图 可以执行两个功能 拖放一个列表中的项目以更改项目的顺序 跨列表拖放项目 项目将从一个列表中删除并添加到另一个列表中 根据 Qt 文档中的拖放示例 我决定创建两个访问同一列表模型的列表视图 列表模型中的每个项目

随机推荐