ubuntu22.04下配置qt5.15.17开发环境

自从qt5.15版本开始,不再提供免费的离线安装包,只能通过源码自行编译。刚好最近需要在ubuntu22.04下配置qt开发环境,于是写篇文章记录配置的过程。

其实一开始是想配置qt5.15.2的,但是在编译配置参数这一步骤中出现如下报错

embedsky@embedsky-virtual-machine:/opt/qt-everywhere-src-5.15.2$ make clean
make: *** No rule to make target 'clean'.  Stop.
embedsky@embedsky-virtual-machine:/opt/qt-everywhere-src-5.15.2$ ./configure -prefix /opt/qt5.15.2 -opensource -confirm-license -nomake tests -nomake examples -c++std c++14
+ cd qtbase
+ /opt/qt-everywhere-src-5.15.2/qtbase/configure -top-level -prefix /opt/qt5.15.2 -opensource -confirm-license -nomake tests -nomake examples -c++std c++14
Creating qmake...
.In file included from /opt/qt-everywhere-src-5.15.2/qtbase/include/QtCore/qfloat16.h:1,from /opt/qt-everywhere-src-5.15.2/qtbase/include/QtCore/../../src/corelib/global/qendian.h:44,from /opt/qt-everywhere-src-5.15.2/qtbase/include/QtCore/qendian.h:1,from /opt/qt-everywhere-src-5.15.2/qtbase/src/corelib/codecs/qutfcodec.cpp:43:
/opt/qt-everywhere-src-5.15.2/qtbase/include/QtCore/../../src/corelib/global/qfloat16.h:300:7: error: ‘numeric_limits’ is not a class template300 | class numeric_limits<QT_PREPEND_NAMESPACE(qfloat16)> : public numeric_limits<float>|       ^~~~~~~~~~~~~~
/opt/qt-everywhere-src-5.15.2/qtbase/include/QtCore/../../src/corelib/global/qfloat16.h:300:77: error: expected template-name before ‘<’ token300 | class numeric_limits<QT_PREPEND_NAMESPACE(qfloat16)> : public numeric_limits<float>|                                                                             ^
/opt/qt-everywhere-src-5.15.2/qtbase/include/QtCore/../../src/corelib/global/qfloat16.h:300:77: error: expected ‘{’ before ‘<’ token
/opt/qt-everywhere-src-5.15.2/qtbase/include/QtCore/../../src/corelib/global/qfloat16.h:344:18: error: ‘numeric_limits’ is not a class template344 | template<> class numeric_limits<const QT_PREPEND_NAMESPACE(qfloat16)>|                  ^~~~~~~~~~~~~~
/opt/qt-everywhere-src-5.15.2/qtbase/include/QtCore/../../src/corelib/global/qfloat16.h:344:69: error: ‘std::numeric_limits’ is not a template344 | template<> class numeric_limits<const QT_PREPEND_NAMESPACE(qfloat16)>|                                                                     ^
/opt/qt-everywhere-src-5.15.2/qtbase/include/QtCore/../../src/corelib/global/qfloat16.h:300:7: note: previous declaration here300 | class numeric_limits<QT_PREPEND_NAMESPACE(qfloat16)> : public numeric_limits<float>|       ^~~~~~~~~~~~~~
/opt/qt-everywhere-src-5.15.2/qtbase/include/QtCore/../../src/corelib/global/qfloat16.h:345:28: error: expected template-name before ‘<’ token345 |     : public numeric_limits<QT_PREPEND_NAMESPACE(qfloat16)> {};|                            ^
/opt/qt-everywhere-src-5.15.2/qtbase/include/QtCore/../../src/corelib/global/qfloat16.h:346:18: error: ‘numeric_limits’ is not a class template346 | template<> class numeric_limits<volatile QT_PREPEND_NAMESPACE(qfloat16)>|                  ^~~~~~~~~~~~~~
/opt/qt-everywhere-src-5.15.2/qtbase/include/QtCore/../../src/corelib/global/qfloat16.h:346:72: error: ‘std::numeric_limits’ is not a template346 | template<> class numeric_limits<volatile QT_PREPEND_NAMESPACE(qfloat16)>|                                                                        ^
/opt/qt-everywhere-src-5.15.2/qtbase/include/QtCore/../../src/corelib/global/qfloat16.h:300:7: note: previous declaration here300 | class numeric_limits<QT_PREPEND_NAMESPACE(qfloat16)> : public numeric_limits<float>|       ^~~~~~~~~~~~~~
/opt/qt-everywhere-src-5.15.2/qtbase/include/QtCore/../../src/corelib/global/qfloat16.h:347:28: error: expected template-name before ‘<’ token347 |     : public numeric_limits<QT_PREPEND_NAMESPACE(qfloat16)> {};|                            ^
/opt/qt-everywhere-src-5.15.2/qtbase/include/QtCore/../../src/corelib/global/qfloat16.h:348:18: error: ‘numeric_limits’ is not a class template348 | template<> class numeric_limits<const volatile QT_PREPEND_NAMESPACE(qfloat16)>|                  ^~~~~~~~~~~~~~
/opt/qt-everywhere-src-5.15.2/qtbase/include/QtCore/../../src/corelib/global/qfloat16.h:348:78: error: ‘std::numeric_limits’ is not a template348 | template<> class numeric_limits<const volatile QT_PREPEND_NAMESPACE(qfloat16)>|                                                                              ^
/opt/qt-everywhere-src-5.15.2/qtbase/include/QtCore/../../src/corelib/global/qfloat16.h:300:7: note: previous declaration here300 | class numeric_limits<QT_PREPEND_NAMESPACE(qfloat16)> : public numeric_limits<float>|       ^~~~~~~~~~~~~~
/opt/qt-everywhere-src-5.15.2/qtbase/include/QtCore/../../src/corelib/global/qfloat16.h:349:28: error: expected template-name before ‘<’ token349 |     : public numeric_limits<QT_PREPEND_NAMESPACE(qfloat16)> {};|                            ^
In file included from /opt/qt-everywhere-src-5.15.2/qtbase/include/QtCore/qendian.h:1,from /opt/qt-everywhere-src-5.15.2/qtbase/src/corelib/codecs/qutfcodec.cpp:43:
/opt/qt-everywhere-src-5.15.2/qtbase/include/QtCore/../../src/corelib/global/qendian.h: In static member function ‘static constexpr QSpecialInteger<S> QSpecialInteger<S>::max()’:
/opt/qt-everywhere-src-5.15.2/qtbase/include/QtCore/../../src/corelib/global/qendian.h:331:30: error: ‘std::numeric_limits’ is not a template331 |     { return QSpecialInteger(std::numeric_limits<T>::max()); }|                              ^~~
/opt/qt-everywhere-src-5.15.2/qtbase/include/QtCore/../../src/corelib/global/qendian.h:331:54: error: incomplete type ‘std::numeric_limits’ used in nested name specifier331 |     { return QSpecialInteger(std::numeric_limits<T>::max()); }|                                                      ^~~
/opt/qt-everywhere-src-5.15.2/qtbase/include/QtCore/../../src/corelib/global/qendian.h: In static member function ‘static constexpr QSpecialInteger<S> QSpecialInteger<S>::min()’:
/opt/qt-everywhere-src-5.15.2/qtbase/include/QtCore/../../src/corelib/global/qendian.h:333:30: error: ‘std::numeric_limits’ is not a template333 |     { return QSpecialInteger(std::numeric_limits<T>::min()); }|                              ^~~
/opt/qt-everywhere-src-5.15.2/qtbase/include/QtCore/../../src/corelib/global/qendian.h:333:54: error: incomplete type ‘std::numeric_limits’ used in nested name specifier333 |     { return QSpecialInteger(std::numeric_limits<T>::min()); }|                                                      ^~~
gmake: *** [Makefile:383: qutfcodec.o] Error 1 

从错误日志来看,核心问题是:
error: ‘numeric_limits’ is not a class template

一通操作还是没能解决,于是打算编译其他版本的qt试试,于是便选择了qt5.15.17

补充:后面根据这篇文章:Loading...https://bugreports.qt.io/browse/QTBUG-90395貌似这是编译qt5.15.2时都会出现的一个bug,这个bug已经在后面的补丁版本中修复。如果非要编译qt5.15.2,具体解决可以参考这篇博客:qt5.15.2源码编译出错处理_qt #include <limits>-CSDN博客


1.执行../qt-everywhere-src-5.15.2/configure -make libs -xplatform aarch64-buildroot-linux-gnu -no-opengl

报错如下: 5.15.2/qtbase/include/QtCore/../../src/corelib/global/qfloat16.h:300:7: error: ‘numeric_limits’ is not a class template   300 | class numeric_limits<QT_PREPEND_NAMESPACE(qfloat16)> : public numeric_limits<float>

解决:修改.qt-everywhere-src-5.15.2/qtbase/src/corelib/global/qglobal.h

增加#include <limits>

以下是编译qt5.15.17的过程

一、下载源码

清华源中下载源码Index of /qt/archive/qt/5.15/5.15.17/single/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror

下载完后:cd qt-everywhere-src-5.15.17

源码目录如下

二、安装相关依赖包

sudo apt update
sudo apt install build-essential perl python3 git
sudo apt install '^libxcb.*' libx11-xcb-dev libglu1-mesa-dev libxrender-dev libxi-dev libxext-dev libxrandr-dev libxcursor-dev libfontconfig1-dev libdbus-1-dev libglib2.0-dev libssl-dev libpng-dev libjpeg-dev libglib2.0-dev
sudo apt install libglib2.0-bin
sudo apt install libxcb-xinerama0-dev libxkbcommon-x11-dev

三、编译配置选项

Qt5采用./configure脚本配置编译选项,我使用的命令如下:

./configure -prefix /opt/qt5.15.17 \
-opensource -confirm-license \
-nomake tests -nomake examples \
-c++std c++14 \
-opengl desktop \-no-use-gold-linker

参数解释:

-prefix:安装路径,建议使用自定义目录如/opt/qt5.15.17
-opensource:使用开源许可证
-confirm-license:自动确认许可协议
-nomake tests -nomake examples:不编译测试和示例,加快速度
-c++std c++14:Qt 5.15默认支持c++14,明确指定
-opengl desktop:使用系统OpenGL(如果需要软件渲染可以用-opengl software)
-no-use-gold-linker:避免使用gold链接器(有时防止编译问题)

如果还有其他编译需求,可以加更多参数

四、编译

执行

make -j4

编译过程可能耗时10~30分钟,具体取决于机器性能。

如果编译遇到make: *** No rule to make target 'clean'等错误,可以用make distclean或者直接删除源码目录重新解压。

五、安装

编译完成后执行:

sudo make install

会将Qt安装到-prefix指定的目录(/opt/qt5.15.17/)。

生成文件目录如下

六、配置qt环境变量

echo 'export PATH=/opt/qt5.15.17/bin:$PATH' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/opt/qt5.15.17/lib:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc

七、验证

输入

qmake -v

输出类似以下即可

QMake version 3.1
Using Qt version 5.15.17 in /opt/qt5.15.17/lib

八、安装Qt Creator

在安装完后,发现没有像之前离线版本的方式打开Qt Creator。这是因为Qt Creator 是一个独立的 IDE,并不包含在 Qt 源码里,所以你自己编译 Qt 时并不会得到 Qt Creator。

所以需要另外下载Qt Creator

sudo apt update
sudo apt install qtcreator

下载完后可以看到

此时已经有完整的ide进行开发了

九、配置kit

编译源码的方式不会自动帮我们配置kit,需要自己手动配置

1、配置g++、gcc

2、配置qmake

3、配置kit

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/914450.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/914450.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

S7-1200 与 S7-300 CPS7-400 CP UDP 通信 Step7 项目编程

S7-1200 CPU 与S7-300 CP STEP7 UDP通信S7-1200 与 S7-300 CP 之间的以太网通信可以通过 UDP 协议来实现&#xff0c;使用的通信指令是在S7-1200 CPU 侧调用通信-开放式用户通信TSEND_C&#xff0c;TRCV_C指令或TCON&#xff0c;TDISCON&#xff0c;TUSEND&#xff0c;TURCV 指…

基于YOLOv11的无人机目标检测实战(Windows环境)

1. 环境搭建 1.1 硬件与操作系统 操作系统&#xff1a;Windows 11 CPU&#xff1a;Intel i7-9700 GPU&#xff1a;NVIDIA RTX 2080&#xff08;8GB显存&#xff09; 1.2 安装CUDA和cuDNN 由于YOLOv11依赖PyTorch的GPU加速&#xff0c;需要安装CUDA和cuDNN&#xff1a; 安…

Spring Cloud分布式配置中心:架构设计与技术实践

从单体到微服务&#xff1a;Spring Cloud 开篇与微服务设计 Spring Cloud服务注册与发现&#xff1a;架构设计与技术实践深度分析 在以往分享中&#xff0c;码友们已经掌握了微服务的设计和注册中心的设计&#xff0c;部分聪明的码友已经察觉了&#xff0c;已经到了需要设计一个…

15.2 Common Criteria合规

目录1. Common Criteria简介1.1 CC评估要素1.2 CC与TF-A的关系2. TF-A的CC合规要求2.1 安全功能需求2.2 开发过程要求3. TF-A的CC合规实现3.1 关键安全机制3.2 开发流程控制4. CC认证实践指南4.1 认证准备步骤4.2 典型挑战与解决方案4.3 已认证案例参考5. 持续合规建议1. Commo…

【前端:Typst】--let关键字的用法

在 Typst 中&#xff0c;#let 命令是用于定义变量和函数的核心指令&#xff0c;其用法非常灵活。以下是详细的用法说明和示例。 目录 1.基础变量定义 2.函数定义 3.默认参数 4.内容块参数&#xff08;Content Blocks&#xff09; 5.递归函数 1.基础变量定义 // 定义简单…

Qt轮廓分析设计+算法+避坑

轮廓分析拟合方面我现在只考虑矩形拟合和圆形拟合细分的话&#xff0c;椭圆拟合&#xff0c;矩形拟合&#xff0c;最小外接矩形&#xff0c;最小外接圆。对于一张图像可能有不同的图形&#xff0c;不同的圆&#xff0c;不同的矩形&#xff0c;我需要对其进行筛选&#xff0c;也…

C++中STL六大组件List的简单介绍

一、前言C非常重视效率&#xff0c;对效率有损失的代码常常是能省则省。使用list要包含的头文件是<list>&#xff0c;要包含头文件就是#iinclude <list>&#xff0c;List肯定是一种链表&#xff0c;我们不妨回忆一下那种链表插入删除效率最快也就是最简单&#xff…

第十五节:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入门 - vue前端 生产部署

Vben Admin vben5 系列文章目录 💻 基础篇 ✅ 第一节:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入门 ✅ 第二节:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入门 - Python Flask 后端开发详解(附源码) ✅ 第三节:Vben Admin 最新 v5.0 (vben5) + Python …

背包初步(0-1背包、完全背包)

当月光洒在我的脸上 我想我就快变了模样 有一种叫做撕心裂肺的汤 喝了它有神奇的力量 动态规划初步&#xff08;完全背包&#xff09; 目录动态规划初步&#xff08;完全背包&#xff09;0-1背包简介完全背包检查数组是否存在有效划分&#xff08;前缀划分DP&#xff09;单词拆…

Linux驱动06 --- UDP

目录 一、UDP 1.1 介绍 1.2 UDP 的通信方式 1.3 单播 发送函数 接收函数 1.4 广播 1.5 组播/多播 一、UDP 1.1 介绍 传输层的另外一个协议 面向无连接&#xff0c;不稳定&#xff0c;速度快&#xff0c;可以一对多 UDP&#xff08;User Datagram Protocol&…

AJAX 投票:技术解析与应用场景

AJAX 投票:技术解析与应用场景 引言 随着互联网技术的不断发展,Web应用的用户体验越来越受到重视。AJAX(Asynchronous JavaScript and XML)作为一种重要的技术,在实现异步数据交互方面发挥着关键作用。本文将深入探讨AJAX投票系统的技术原理、应用场景以及优化策略。 A…

【字节跳动】数据挖掘面试题0017:推荐算法:双塔模型,怎么把内容精准地推送给用户

文章大纲 双塔模型:推荐算法中的“高效匹配引擎一、双塔模型的核心思想:“分而治之” 的匹配逻辑二、双塔模型的结构:从特征输入到相似度输出1. 输入层:特征的 “原材料处理”2. 塔网络层:用户与物品的“个性化编码”3. 交互层:向量相似度的“偏好打分”三、双塔模型的优…

7月14日日记

数学类今天考完最后一科英语放假回家了。有点羡慕他们。今天英语成绩出来了&#xff0c;我是89分&#xff0c;一开始有点失望&#xff0c;感觉没有上90&#xff0c;这是一个很好的冲击4.0 的机会。但是后来一想好像也没什么可惜的&#xff0c;这个分数还是很高的。舍友小林是90…

js的局部变量和全局变量

全局变量常常定义在函数外&#xff0c;具有全局定义域&#xff0c;在整个js代码的任何地方都可以使用&#xff0c;这个就叫全局变量局部变量定义在函数内部&#xff0c;只在当前函数的定义域可以被使用&#xff0c;而且不同的函数可以定义相同的局部变量&#xff0c;他们之间相…

C++ 多态详解:从概念到实现原理----《Hello C++ Wrold!》(14)--(C/C++)

文章目录前言多态的概念多态的定义和实现虚函数虚函数的重写(覆盖)多态的构成条件override 和 final&#xff08;C11提出&#xff09;finaloverride重载、覆盖(重写)、隐藏(重定义)的对比抽象类接口继承和实现继承多态的原理虚函数表(也叫做虚表)引申:虚表的打印多态的原理静态…

Node.js + Express的数据库AB View切换方案设计

方案总览数据导入过程&#xff1a; - 根据控制表判断当前活跃组&#xff08;假设当前活跃的是a&#xff0c;那么接下来要导入到b&#xff09;。 - 清空非活跃表&#xff08;即b表&#xff09;的数据&#xff0c;然后将新数据导入到b表。 - 切换控制表&#xff0c;将活…

C++_编程提升_temaplate模板_案例

类模板案例案例描述: 实现一个通用的数组类&#xff0c;要求如下&#xff1a;可以对内置数据类型以及自定义数据类型的数据进行存储将数组中的数据存储到堆区构造函数中可以传入数组的容量提供对应的拷贝构造函数以及operator防止浅拷贝问题提供尾插法和尾删法对数组中的数据进…

Win11系统安装Anaconda环境极简教程

Win11系统安装Anaconda环境极简教程 &#x1f4e5; 第一步&#xff1a;下载 Anaconda 安装包 打开浏览器&#xff0c;访问 Anaconda 官网&#xff0c;选择View All Installers 选择所需版本&#xff08;此文以2024.02-1为例&#xff09;&#xff0c;点击进行下载&#xff08;…

Datawhale AI夏令营-基于带货视频评论的用户洞察挑战赛

一.赛事目标基于星火大模型Spark 4.0 Ultra&#xff0c;对视频和评论的数据进行商品识别&#xff0c;情感分析&#xff0c;归类分析&#xff0c;最终为带货效果进行评价。并通过优化模型来提高评价准确度二.赛事环境1.基础平台&#xff1a;星火大模型Spark 4.0 Ultra2.赛事数据…

如何基于FFMPEG 实现视频推拉流

文章目录 前言环境准备为什么选择 FFmpeg什么是nginx 1.7.11.3 GryphonNginx的conf配置启动nginx推流命令接收视频流Untiy播放视频流最后前言 我们经常会有在电脑上实现推拉流的需求,Unity 和Unreal 都提供了基于WebRTC 的视频流方案,效果还不错,但是当我们需要推拉整个电脑…