从源代码部分构建 Qt6 配置构建构建目标第一轮第 2 轮旁白:使用 CMake 安装第 3 轮

如何解决从源代码部分构建 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 上不构建不需要的东西的另一种简单方法是简单地从源代码树中删除任何顶级目录。例如,如果您不想构建 qtremoteobjectsqtwebengine,您只需删除这些顶级目录。 (每次我们进行新的 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 将使构建工具列出其已知目标(至少使用 makeninja,不确定是否通用)。

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 QtCoreQtGui 构建为依赖项,以及大块的 QtWidgetsQtDeclarativeQML 所在的位置)和其他模块,我在第一次运行时跳过了所有这些模块,因为我只想要 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 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-