如何在 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 子目录项目中设置构建顺序 的相关文章

  • 如何使用蚂蚁?

    我一直试图了解 Ant 的用途 但我仍然不明白 有人可以给我一个使用 Ant 的用例吗 我可以尝试看看 Ant 为何有用以及我可以用它做什么 我在 Eclipse 中进行 Java 开发 并且刚刚开始使用 servlet 和 Google
  • 根据代码版本测试和管理数据库版本

    当您开发应用程序时 数据库的更改不可避免地会出现 我发现的技巧是让数据库构建与代码保持同步 过去 我添加了一个针对目标数据库执行 SQL 脚本的构建步骤 但这很危险 因为您可能会无意中添加虚假数据或更糟的情况 我的问题是保持数据库与代码同步
  • [本机]:在Qt for Android中使用Java函数和第3方库[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 最近我用qt写了一个android应用程序 但我有一个很大的问题 我可以使用 调用一些原生的android API 比如调用特殊的activit
  • Qt GUI 编程设计

    我正在尝试创建一个 GUI 应用程序 主窗口 一个QMainWindow 包含 9 个固定大小的标签以及主窗口的大小 我尝试在没有 Qt GUI Designer 的情况下以编程方式制作它 该项目构建时没有错误 但我看不到主窗口上显示的任何
  • 如何获取 QIcon 的文件/资源​​路径

    假设我做了这样的事情 QIcon myIcon resources icon ico 我稍后如何确定该图标的路径 例如 QString path myIcon getPath 问题是 没有getPath 会员 我找不到类似的东西 但肯定有办
  • 仅将非模态 QDialog 窗口放置在我的应用程序顶部,而不是所有应用程序顶部

    我有一个 QDialog 窗口 它应该始终位于我的应用程序顶部 它不是模态的 用户可以随时与对话框和主应用程序进行交互 使用窗口保持在顶部提示在某种程度上实现了这一点 但是 该对话框仍然位于所有其他正在运行的应用程序 例如记事本 chrom
  • 当 QML 对象不可见时防止 QML 属性绑定?

    我正在开发一个具有大量属性绑定的 QML 应用程序 数百个对象被跟踪并以不同的形式显示 例如 Qt3D QCanvas 当我在应用程序的单独页面上时 x y 位置和相对大小的属性绑定仍在发生 我怎样才能阻止他们 我知道我可以根据属性是否可视
  • 如何在 C++ 和 QML 应用程序中使用 qrc?

    我在 Windows7 上用 c qnd Qt Creator QML 编写了 Qt Quick Desktop 应用程序 现在 我必须部署它 并且我需要隐藏 qml 文件和图像 意味着 将它们放入资源等中 我读到有一个很好的方法可以使用
  • 如何创建QWidget的屏幕截图?

    我在 Qt Creator 中做作业 在其中绘制 QWidget 并且需要保存此 QWdiget 的某些部分 我试图解决这个问题 QPixmap pixmap pixmap copy rectangle rectangle is part
  • 通过 PowerShell 对 TFS 构建进行排队

    TFS2012 具有一个 2010 构建控制器和一个 2010 构建代理 还有一个 2012 构建控制器和多个 2012 构建代理 我们的软件有多个版本的多个版本 构建根据约定命名 例如Foo version 1 0 和 Foo versi
  • QDesktopServices::openUrl 在资源管理器中选择指定文件

    在大多数编码程序中 您可以右键单击该项目 然后单击 在资源管理器中显示 它会在资源管理器中显示选定项目的文件 在 Qt 中使用 QDesktopServices 如何做到这一点 或在 QT 中执行此操作的任何方式 您可以使用此方法在 Win
  • VSTS 构建失败/发布无法在 bin 文件夹中找到 roslyn\csc.exe

    我们有一个网站项目 安装了以下 nuget 软件包 Microsoft CodeDom Providers DotNetCompilerPlatform 1 0 8 Microsoft Net Compilers 2 4 0 The web
  • Qt中如何获取鼠标在屏幕上的位置?

    我想获取屏幕上的鼠标坐标 我怎样才能在 Qt 中做到这一点 在 Windows 上 使用 C 我正在做类似答案中建议的事情对于这个问题 https stackoverflow com q 11737665 1420197 正如文档所述 QC
  • Qt mouseReleaseEvent() 未触发?

    我有一个显示图片的库 我们称之为 PictureGLWidget 其中 class PictureGLWidget public QGLWidget 所以 PictureGLWidget 扩展了 QGLWidget 在PictureGlWi
  • 如何向 SvelteKit/Vite 应用添加版本号?

    我正在尝试在我的 SvelteKit 应用程序中创建一个系统 它会在某个页面上向您显示有关当前应用程序版本的信息 最好是 Git 提交哈希和描述 我尝试使用Vite的定义功能 https vitejs dev config define在构
  • PyQt:如何设置组合框项目可检查?

    为了将 GUI 小部件数量保持在最低限度 我需要找到一种方法来为用户提供下拉菜单项的选择 这些菜单项可用于过滤掉 listWidget 项中显示的内容 假设 listWidget 列出了 5 个不同类别的项目 Cat A Cat B Cat
  • 如何在带有预编译头的项目中使用google protobuf

    我有一个包含多个项目的解决方案 我的项目 但不是全部 使用预编译头 我决定使用 protobuf 但遇到了一个问题 在 protoc exe 从 proto 生成 pb h 后 我尝试包含标头并收到错误 预编译标头未包含在 pb h 中 我
  • 禁用 QML Slider 的鼠标滚轮

    我希望能够滚动Flickable使用鼠标滚轮 或触摸板上的两根手指 不改变Sliders它可能包含 示例代码及结果应用 import QtQuick 2 7 import QtQuick Window 2 2 import QtQuick
  • 什么是“制定目标”?

    为什么我需要制作一个make target在能够构建我的源代码之前 更具体地说 什么是制定目标 http publib boulder ibm com infocenter rsdvhelp v6r0m1 index jsp topic o
  • 向 Qt 样式表添加特异性时丢失样式

    这是我的代码 const QString STYLE SHEET background color rgba x x x y border 1px solid gray border radius 0px border top 1px so

随机推荐