我需要在 Ubuntu 18 上安装 Qt6。由于 qt6 不在存储库中(或者是吗?),我必须从源代码编译它们。但是,我在我的 VDS 服务器上执行此操作,它不是很强大(2 个内核,4GB 的 RAM),所以我没有足够的能力进行标准 Qt6 编译(编译崩溃并出现“我没有足够的 RAM”之类的错误) . 我想知道是否可以只编译 QtHttpServer(Qt6 的扩展)所需的模块。我试图在文档中找到此信息,但找不到任何东西。
2 回答
旧的 Qt5 方式是传递-skip
给配置命令行。例如configure .... -skip qtremoteobjects -skip qtwebengine
,根据Qt6 构建文档,此选项仍然存在。(在“排除 Qt 模块”页面底部附近滚动)。在您的情况下,您可能会在运行配置时传递很多-skip
语句。每个可用的跳过选项都是源树中的顶级目录。
我还没有研究过使用 Qt 6 进行构建,就像我对 Qt 5 所做的那样。但是在 Qt5 上不构建不需要的东西的另一种简单方法是从源代码树中删除任何顶级目录。例如,如果您不想构建qtremoteobjects
或qtwebengine
,您只需删除那些顶级目录。(每次我们进行新的删除时,我们总是从源代码树中删除 qtwebengine - 它基本上是 Chromium 的全部内容,并且比其他代码库的总和还要大!)不知道在 Qt6 上使用新的 Ninja/CMake 环境删除目录是否有效.
我需要在 Ubuntu 18 上安装 Qt6。由于 qt6 不在存储库中(或者是吗?),我必须从源代码编译它们。
这并不完全跟踪——Qt通过他们的在线安装程序提供二进制下载,您应该能够通过这种方式下载和安装 Qt6。$HOME/Qt/
我在我的 Fedora 33机器上安装了 Qt 6.1.0 的副本,与/usr/lib64/qt5/
. 我没有编译任何它。
但是,也许您需要针对 Qt 源代码编译其他代码——获得一个工作的构建环境仍然是值得的。
配置构建
在源代码树中运行./configure --help
列出了可用于配置的选项,包括给出 a 的定义<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 目标,而不是默认的目标。运行将使构建工具列出其已知目标(至少使用or ,不确定这是否通用)。all
--target <name>
cmake --build
cmake --build <builddir> --target help
make
ninja
QtHttpServer
本身未列为目标。列出的http
功能Qt::Network
是目标的一部分,但您无法构建功能。不过,大概QtHttpServer
也是. _ _Qt::Network
Network
* –(事实证明,CMake 将配置构建以自动编译任何运行时依赖项QtNetwork
,但在安装时存在 Qt 尚未完全定义为需要它们的目标的先决条件的依赖项。)
第1轮
因此,在下载 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
这实际上需要更长的时间,因为要构建全套工具(一些图形),我现在需要将大部分QtCore
、QtGui
和QtWidgets
构建为依赖项,以及大块QtDeclarative
(whereQML
和QtQuick
live)和其他模块,所有这些我在第一次运行时跳过,因为我只想要QtNetwork
.
最初排除一些带有./configure
选项的树在这里会有所帮助,因为我可以避免构建很多我不需要的工具。可能还有更细粒度的目标可用,可以让我只构建安装脚本所需的特定工具(依赖较少),但是嗯。无论如何,如果没有核心库,Qt 就毫无用处。尽管如此,如果你像你说的那样受到限制,那么花更多的时间configure
来减少构建集,正如另一个答案中详述的 selbie 那样,仍然值得。
旁白:使用 CMake 安装
值得注意的是,它cmake --install
不会触发额外的构建(因此我的第一次尝试失败了);它只安装已经构建的任何东西。因此,cmake --install .
在过程中的任何时候运行实验都是安全的。最坏的情况是缺少组件。
(与类似的工具形成鲜明对比make
,您通常可以在其中运行 a以一步make install
构建和cmake --install
安装树,如果您在完全未构建的树上运行,则不会触发任何构建。在普通的 CMake 树中,它将只是开始喷出关于每个默认输出丢失的失败消息,然后“成功”退出而没有做任何事情。但是,Qt 有一些自定义安装脚本期望访问构建树中的某些文件,所以在一个未构建/部分构建的 Qt 构建树会导致安装脚本在找不到这些文件时出错。)
第三轮
所以,我开了个玩笑:即使构建了所有的qttools
,cmake --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
...如果一切顺利(确实如此),关于我迄今为止安装的组件状态的大量信息应该转储到标准输出。