如何解决从源代码部分构建 Qt6 配置构建构建目标第一轮第 2 轮旁白:使用 CMake 安装第 3 轮
我需要在 Ubuntu 18 上安装 Qt6。由于 qt6 不在存储库中(或者不在?),我必须从源代码编译它们。但是,我在我的 VDS 服务器上执行此操作,该服务器不是很强大(2 个内核,4GB RAM),因此我没有足够的能力进行标准 Qt6 编译(编译崩溃并出现诸如“我没有足够的 RAM”之类的错误) .我想知道是否可以只编译 QtHttpServer(Qt6 的扩展)所需的模块。 我试图在文档中找到此信息,但找不到任何内容。
解决方法
旧的 Qt5 方式是将 -skip
传递给 configure 命令行。例如configure .... -skip qtremoteobjects -skip qtwebengine
根据Qt6 build documentation,这个选项仍然存在。 (在“排除 Qt 模块”上滚动到该页面底部附近)。在您的情况下,您可能会在运行配置时传递很多 -skip
语句。每个可用的跳过选项都是源代码树中的顶级目录。
我还没有研究过使用 Qt 6 构建,就像使用 Qt 5 一样。但是在 Qt5 上不构建不需要的东西的另一种简单方法是简单地从源代码树中删除任何顶级目录。例如,如果您不想构建 qtremoteobjects
或 qtwebengine
,您只需删除这些顶级目录。 (每次我们进行新的 drop 时,我们总是从源代码树中删除 qtwebengine - 它本质上是 Chromium 的全部,并且比代码库的其余部分加起来还要大!)不知道删除目录是否适用于 Qt6 的新 Ninja/CMake 环境.
我需要在 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 生成其构建系统,您实际上可以对过程进行相当细粒度的控制。生成构建树后,您可以通过向 all
命令行添加 --target <name>
参数来精确指定要构建的 CMake targets,而不是默认的 cmake --build
。运行 cmake --build <builddir> --target help
将使构建工具列出其已知目标(至少使用 make
或 ninja
,不确定是否通用)。
QtHttpServer
本身没有被列为目标。列出了 http
功能,它是 Qt::Network
目标的一部分,但您无法构建功能。不过,大概 QtHttpServer
也是 Qt::Network
的一部分 - 您可以使用目标 { 单独构建 (但具有所有必需的依赖项)* {1}}。
* –(事实证明,CMake 将配置构建以自动编译 Network
的任何runtime 依赖项,但是在安装时存在 Qt 尚未完全定义的依赖项作为需要它们的目标的先决条件。)
第一轮
因此,在使用他们的在线安装程序将 Qt6 源代码下载到 QtNetwork
后,我最初的尝试是:
$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`
步骤失败,因为它缺少安装过程使用的辅助工具。
第 2 轮
所以我又进行了一次构建运行:
--install
这实际上需要更长的时间,因为要构建全套工具(一些图形工具),我现在需要将大部分 cmake --build . --target qttools
、QtCore
和 QtGui
构建为依赖项,以及大块的 QtWidgets
(QtDeclarative
和 QML
所在的位置)和其他模块,我在第一次运行时跳过了所有这些模块,因为我只想要 QtQuick
。>
使用 QtNetwork
选项排除一些树最初会有所帮助,因为我本可以避免构建许多我不需要需要的工具。可能还有更细粒度的目标可用,让我只构建安装脚本所需的特定工具(依赖较少),但我不知道。无论如何,如果没有核心库,Qt 就毫无用处。尽管如此,如果您像您所说的那样受到限制,那么在最初的 ./configure
上花更多时间来缩减构建集,正如另一个答案中详述的 selbie,仍然值得。
旁白:使用 CMake 安装
值得注意的是,configure
不会触发额外的构建(因此我的第一次尝试失败了);它只安装已经构建的任何东西。因此,在该过程的任何时候运行一个实验性的 cmake --install
都是安全的。最坏的情况是缺少组件。
(与 cmake --install .
之类的工具形成鲜明对比,如果您运行 {{ 1}} 在完全未构建的树上,它不会触发任何构建。在普通的 CMake 树中,它只会开始喷出关于每个默认输出丢失的失败消息,然后“成功”退出什么也没做。但是,Qt 有一些自定义安装脚本,它们希望访问构建树中的某些文件,因此在未构建/部分构建的 Qt 构建树中执行相同的操作会导致安装脚本在找不到这些文件时出错。)
第 3 轮
所以,我开了个玩笑:即使在构建了所有 make
之后,make install
仍然失败并显示完全相同的错误消息:
cmake --install
似乎 qttools
甚至不是 cmake --install .
的一部分...但它是自己的目标。所以我应该在第 2 轮中做的是:
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
我还可以执行以下操作:
cmake --build . --target tracegen
安装单独的高级模块。 QtBase 是迄今为止最关键的,没有它你就没有任何合理定义的 Qt 安装。
这样做之后,这是一个很好的测试基础是否有效:
QtNetwork
...如果一切顺利(确实如此),关于我迄今为止安装的组件状态的大量信息应该转储到标准输出。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。