我需要在 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 将使构建工具列出其已知目标(至少对于make 或ninja,不确定是否通用)。
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
这实际上需要更长的时间,因为要构建全套工具(一些图形),我现在需要将大部分 QtCore、QtGui 和 QtWidgets 构建为依赖项,以及大量 @ 987654349@(其中QML 和QtQuick 直播)和其他模块,我在第一次运行时跳过了所有这些模块,因为我只想要QtNetwork。
最初使用./configure 选项排除一些树在这里会有所帮助,因为我可以避免构建很多我不需要需要的工具。可能还有更细粒度的目标可用,让我只构建安装脚本所需的特定工具(依赖较少),但是嗯。无论如何,如果没有核心库,Qt 就毫无用处。尽管如此,如果您像您说的那样受到限制,那么花更多时间使用最初的 configure 来削减构建集,正如另一个答案中详述的 selbie 那样,仍然值得。
旁白:使用 CMake 安装
值得注意的是cmake --install 不会触发额外的构建(因此我的第一次尝试失败了);它只安装已经构建的任何东西。因此,在过程中的任何时候运行实验性cmake --install . 都是安全的。最坏的情况是缺少组件。
(与make 等工具形成鲜明对比,您通常可以在其中运行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
...如果一切顺利(确实如此),关于我迄今为止安装的组件状态的大量信息应该转储到标准输出。