【问题标题】:Partial build of Qt6 from source从源代码构建 Qt6 的部分内容
【发布时间】:2021-06-20 11:08:22
【问题描述】:

我需要在 Ubuntu 18 上安装 Qt6。由于 qt6 不在存储库中(或者是吗?),我必须从源代码编译它们。但是,我在我的 VDS 服务器上执行此操作,它不是很强大(2 核,4GB 的 RAM),所以我没有足够的能力进行标准 Qt6 编译(编译崩溃并出现“我没有足够的 RAM”之类的错误) .我想知道是否可以只编译 QtHttpServer(Qt6 的扩展)所需的模块。 我试图在文档中找到此信息,但找不到任何内容。

【问题讨论】:

    标签: c++ qt qt6


    【解决方案1】:

    旧的 Qt5 方法是将-skip 传递给配置命令行。例如configure .... -skip qtremoteobjects -skip qtwebengine 根据Qt6 build documentation,这个选项仍然存在。 (在“排除 Qt 模块”页面底部附近滚动)。在您的情况下,您可能会在运行 configure 时传递大量 -skip 语句。每个可用的跳过选项都是源代码树中的顶级目录。

    我还没有研究过使用 Qt 6 进行构建,就像我使用 Qt 5 一样。但是在 Qt5 上不构建您不需要的东西的另一个简单方法是从源代码树中删除任何顶级目录。例如,如果您不想构建qtremoteobjectsqtwebengine,您只需删除那些顶级目录。 (每次我们进行新的删除时,我们总是从源代码树中删除 qtwebengine - 它基本上是 Chromium 的全部内容,并且比其他代码库的总和还要大!)不知道在 Qt6 上使用新的 Ninja/CMake 环境删除目录是否有效.

    【讨论】:

    • 有一个-make <part> 选项声称只构建您指定的内容。但我找不到任何关于“部件”是什么的信息,我无法让它发挥作用。
    【解决方案2】:

    我需要在 Ubuntu 18 上安装 Qt6。由于 qt6 不在存储库中(或者是吗?),我必须从源代码编译它们。

    这并不完全符合 — Qt 通过他们的在线安装程序提供binary downloads,您应该可以通过这种方式下载和安装 Qt6。我在我的 Fedora 33 机器上的 $HOME/Qt/ 中安装了 Qt 6.1.0 的副本,与 /usr/lib64/qt5/ 中的 Qt 5.15.2 的系统安装完全分开。而且我没有编译任何一个。

    但是,也许您需要针对 Qt 源代码编译其他代码 - 获得一个有效的构建环境仍然是值得的。

    配置构建

    在源代码树中运行./configure --help 列出了可用于配置的选项,包括给出<part> 的定义:

    $ ./configure --help
    # ...snip...
    Component selection:
    
      -skip  ......... Exclude an entire repository from the build.
      -make  ......... Add  to the list of parts to be built.
                             Specifying this option clears the default list first.
                             (allowed values: libs, tools, examples, tests,
                             benchmarks, manual-tests, minimal-static-tests)
                             [default: libs and examples, also tools if not
                             cross-building, also tests if -developer-build]
      -nomake  ....... Exclude  from the list of parts to be built.
    

    所以,-make 太高级了,对你没有任何用处。

    建筑目标

    不过没关系,因为现在 Qt 正在使用 CMake 来生成它的构建系统,您实际上可以对这个过程进行相当细粒度的控制。生成构建树后,您可以通过在cmake --build 命令行中添加--target <name> 参数来精确指定要构建的CMake targets,而不是默认的all。运行cmake --build <builddir> --target help 将使构建工具列出其已知目标(至少对于makeninja,不确定是否通用)。

    QtHttpServer 本身并未列为目标。列出了 http feature,它是 Qt::Network 目标的一部分,但您无法构建功能。不过,大概QtHttpServer 也是Qt::Network 的一部分——您可以使用目标Network 单独构建(但具有所有必需的依赖项)*

    * – (事实证明,CMake 将配置构建以自动编译 QtNetwork 的任何 runtime 依赖项,但在安装时存在 Qt 尚未完全定义为先决条件的依赖项对于需要它们的目标。)

    第一轮

    所以,在使用他们的在线安装程序将 Qt6 源下载到 $HOME/Qt/6.1.0/Src 后,我最初的尝试是:

    cd $HOME/Qt/6.1.0/Src
    ./configure -prefix $HOME/Qt/my_6.1.0
    cmake --build . --target Network
    cmake --install .  # Installs to the location given in `configure -prefix`
    

    ...在--install 步骤失败,因为它缺少安装过程使用的帮助工具。

    第二轮

    所以我又进行了一次构建运行:

    cmake --build . --target qttools
    

    这实际上需要更长的时间,因为要构建全套工具(一些图形),我现在需要将大部分 QtCoreQtGuiQtWidgets 构建为依赖项,以及大量 @ 987654349@(其中QMLQtQuick 直播)和其他模块,我在第一次运行时跳过了所有这些模块,因为我只想要QtNetwork

    最初使用./configure 选项排除一些树在这里会有所帮助,因为我可以避免构建很多我不需要需要的工具。可能还有更细粒度的目标可用,让我只构建安装脚本所需的特定工具(依赖较少),但是嗯。无论如何,如果没有核心库,Qt 就毫无用处。尽管如此,如果您像您说的那样受到限制,那么花更多时间使用最初的 configure 来削减构建集,正如另一个答案中详述的 selbie 那样,仍然值得。

    旁白:使用 CMake 安装

    值得注意的是cmake --install 不会触发额外的构建(因此我的第一次尝试失败了);它只安装已经构建的任何东西。因此,在过程中的任何时候运行实验性cmake --install . 都是安全的。最坏的情况是缺少组件。

    (与make 等工具形成鲜明对比,您通常可以在其中运行make install 来构建如果您完全运行cmake --install未构建的树,它不会触发任何构建。在普通的 CMake 树中,它只会开始喷出关于每个默认输出丢失的失败消息,然后在没有做任何事情的情况下“成功”退出。但是,Qt 有一些自定义安装期望访问构建树中某些文件的脚本,因此在未构建/部分构建的 Qt 构建树中执行相同操作会导致安装脚本在找不到这些文件时出错。)

    第三轮

    所以,我开了个玩笑:即使在构建了所有 qttoolscmake --install . 仍然失败并显示 EXACT SAME 错误消息:

    CMake Error at qtbase/src/tools/tracegen/cmake_install.cmake:53 (file):
      file INSTALL cannot find "$HOME/Qt/6.1.0/Src/qtbase/libexec/tracegen":
      No such file or directory.
    Call Stack (most recent call first):
      qtbase/src/cmake_install.cmake:67 (include)
      qtbase/cmake_install.cmake:231 (include)
      cmake_install.cmake:47 (include)
    

    似乎tracegen 甚至不是qttools 的一部分...但它它自己的目标。所以我应该在第 2 轮中做的是:

    cmake --build . --target tracegen
    

    这样做之后,这可以安装(仅)QtNetwork

    cmake --install ./qtbase/src/network
    

    我也可以这样做:

    cmake --build . --target qtbase
    cmake --build . --target qmake  # The qtbase install crashes without it
    cmake --install ./qtbase
    

    安装单个高级模块。到目前为止,QtBase 是最关键的,没有它,您就没有任何合理定义的 Qt 安装。

    这样做之后,这是对基础是否有效的一个很好的测试:

    cmake --build . --target qtdiag
    cmake --install ./qttools/src/qtdiag
    $HOME/Qt/my_6.1.0/bin/qtdiag
    

    ...如果一切顺利(确实如此),关于我迄今为止安装的组件状态的大量信息应该转储到标准输出。

    【讨论】:

      猜你喜欢
      • 2016-07-03
      • 2013-06-01
      • 2012-12-11
      • 2015-08-20
      • 2011-09-05
      • 2020-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多