基于ARM的通用的Qt移植思路
文章目录
- 实验环境介绍
- 一、确认Qt版本
- 二、确认交叉编译工具链
- 三、配置Qt
- 3.1、修改qmake.conf
- 3.2、创建autoConfig.sh配置文件
- 四、编译安装Qt
- 五、移植Qt安装目录
- 六、配置Qt creator
- 6.1、配置qmake
- 6.2、配置GCC编译器
- 6.3、配置G++编译器
- 6.4、配置编译器套件
- 6.5、创建应用
- 七、总结
实验环境介绍
硬件:韦东山T113工业开发板
软件:Tina5.0 SDK
一、确认Qt版本
无论在什么平台,第一件事先确认Qt版本,用哪个就下载哪个。比如项目需要使用Qt5.15.9,那么就下载Qt5.15.9的源码:

解压源码:
tar -xvf qt-everywhere-opensource-src-5.15.9.tar.xz
二、确认交叉编译工具链
交叉编译工具链的确认需要参考目标平台的架构和Qt的版本。比如,我的Qt程序是要放到arm开发板上运行,那就选择arm交叉编译工具链。然而,Qt5.15.9对gcc版本的要求是要大于5,那么所选的arm交叉编译工具链的gcc版本就要高于5。
所以此例中,我所使用的arm交叉编译工具链为gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi,该工具链的gcc版本为7.2.1:

交叉编译工具链下载好后,设置环境变量:
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabi-
export PATH=$PATH:/t113/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi/bin/
三、配置Qt
3.1、修改qmake.conf
进入mkspecs目录:
cd qt-everywhere-src-5.15.9/qtbase/mkspecs

该目录包含了一系列与平台编译器设置相关的文件夹,我的目标平台是arm架构,那么就修改linux-arm-gnueabi-g++目录下的qmake.conf:
vi linux-arm-gnueabi-g++/qmake.conf
这里将工具链前缀修改成我们所要用的工具链前缀:

3.2、创建autoConfig.sh配置文件
进入Qt源码根目录,创建配置文件autoConfig.sh:
cd qt-everywhere-src-5.15.9
vi autoConfig.sh
autoConfig.sh内容如下:
./configure \
-xplatform linux-arm-gnueabi-g++ \
-prefix /opt/qt/qtresource/qt5.15.9 \
-release \
-opensource \
-skip qtwayland \
-skip qtlocation \
-skip qtscript \
-make libs \
-optimized-qmake \
-no-opengl \
-no-sse2 \
-no-openssl \
-no-cups \
-no-glib \
-no-pkg-config \
-no-separate-debug-info \
-pch \
-shared \
-qt-libjpeg \
-qt-zlib \
-qt-libpng
-xplatform linux-arm-gnueabi-g++指定了目标平台和工具链。-prefix指定安装目录。其它的都是一些关于Qt的配置选项。
最后执行配置文件进行配置:
./autoConfig.sh
四、编译安装Qt
配置完成后,开始编译:
make -j8
编译成功后,开始安装:
make install
安装路径即为上面所指定的/opt/qt/qtresource/qt5.15.9。
五、移植Qt安装目录
本文主要讲述通用的Qt移植,以便以后在不同平台移植Qt。
1、在任意位置创建一个文件夹,这里命名为:Qt-5.15.9,该文件夹将放置所有关于应用程序的支持,如动态库、插件、字体等。
mkdir Qt-5.15.9
2、将安装目录下的bin、lib、plugins目录复制到Qt-5.15.9:
cp -r /opt/qt/qtresource/qt5.15.9/bin Qt-5.15.9
cp -r /opt/qt/qtresource/qt5.15.9/lib Qt-5.15.9
cp -r /opt/qt/qtresource/qt5.15.9/plugins Qt-5.15.9
3、如果项目中有特殊的字体文件,也一并复制到该文件夹:
cp -r fonts Qt-5.15.9
4、想办法将Qt-5.15.9文件夹弄到开发板,可以直接复制,或通过rootfs overlay的方式。位置随意,我放到了/usr/local/目录:

5、编写用于设置Qt环境变量的开机自启脚本,内容可参考如下:
#!/bin/shexport QTDIR=/usr/local/Qt-5.15.9
export QT_ROOT=$QTDIRexport PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
export QT_PLUGIN_PATH=$QT_ROOT/pluginsexport QT_QPA_PLATFORM=linuxfb:tty=/dev/fb0
export QT_QPA_FONTDIR=$QT_ROOT/fontsexport QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS=/dev/input/event5
六、配置Qt creator
6.1、配置qmake

6.2、配置GCC编译器

6.3、配置G++编译器
步骤同上。
6.4、配置编译器套件

6.5、创建应用
至此,配置结束。可以自行创建应用程序,编译应用,传到开发板进行验证。
七、总结
至此,Qt移植结束。
参考文章:自动驾驶开发入门(一)—交叉编译64位Qt5.15 (aarch64)
相关文章:
基于ARM的通用的Qt移植思路
文章目录 实验环境介绍一、确认Qt版本二、确认交叉编译工具链三、配置Qt3.1、修改qmake.conf3.2、创建autoConfig.sh配置文件 四、编译安装Qt五、移植Qt安装目录六、配置Qt creator6.1、配置qmake6.2、配置GCC编译器6.3、配置G编译器6.4、配置编译器套件6.5、创建应用 七、总结…...
IT专业入门,高考假期预习指南
七月来临,各省高考分数已揭榜完成。而高考的完结并不意味着学习的结束,而是新旅程的开始。对于有志于踏入IT领域的高考少年们,这个假期是开启探索IT世界的绝佳时机。 一、基础课程预习指南 IT专业是一个广泛的领域,涵盖了从软件开…...
芯片详解——AD7606C
芯片详解——AD7606C AD7607C 是一款由 Analog Devices(模拟器件公司)生产的 6 通道同步采样模数转换器(ADC),适用于高速数据采集系统。 工作原理 AD7607C 的工作原理主要包括以下几个步骤: 模拟信号输入:AD7607C 有六个模拟输入通道,可以同时进行采样。这些模拟信号…...
IDEA 编译单个Java文件
文章目录 一、class文件的生成位置二、编译单个文件编译项目报错Error:java: 无效的源发行版: 8 一、class文件的生成位置 file->project structure->Modules 二、编译单个文件 选中文件,点击recompile 编译项目报错 Error:java: 无效的源发行版: 8 Fi…...
人工智能业务分析
人工智能业务分析的组成图 #mermaid-svg-SKV0WrbMSANzQz4U {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SKV0WrbMSANzQz4U .error-icon{fill:#552222;}#mermaid-svg-SKV0WrbMSANzQz4U .error-text{fill:#552222;s…...
随机文本生成器
目录 开头程序程序的流程图程序打印的效果(不必细看,因为字符太多)例1例2例3 结尾 开头 大家好,我叫这是我58。看!这下面有一个程序。 程序 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <random> #includ…...
java中输入输出流的继承关系
在 Java 中,输入输出流的继承关系主要围绕两个抽象基类展开:字节流基类 InputStream 和 OutputStream,以及字符流基类 Reader 和 Writer。这些类形成了 Java I/O 系统的基础,提供了丰富的子类以适应不同的输入输出需求。 字节流 字节流用于处理原始的二进制数据。 Input…...
c++应用网络编程之一基本介绍
一、网络编程介绍 c编程的应用场景在前面分析过,一个重要的方向就是网络编程。一般来说,开发者说的服务端编程在c方向上简单的可以认为是网络编程。首先需要说明的,本系列不对网络编程的相关基础知识展开详细的说明,因为这种知识…...
Web后端开发概述环境搭建项目创建servlet生命周期
Web开发概述 web开发指的就是网页向后再让发送请求,与后端程序进行交互 web后端(javaEE)程序需要运行在服务器中 这样前端才可以对其进行进行访问 什么是服务器? 解释1: 服务器就是一款软件,可以向其发送请求,服务器会做出一个响应.可以在服务器中部署文件,让…...
Java 位运算详解
位运算是一种直接在二进制位上进行操作的方式。位运算符包括按位与 (&)、按位或 (|)、按位异或 (^)、按位非 (~)、左移 (<<)、右移 (>>) 和无符号右移 (>>>)。这些操作符用于操作整型数据类型,如 int 和 long。 一、按位与 (&) 按位…...
智能体实战:开发一个集成国内AI平台的GPTs,自媒体高效智能助手
文章目录 一,什么是GPTs二,开发GPTs1,目标2,开发2.1 打开 GPTS:https://chat.openai.com/gpts2.2 点击 Create 创建一个自己的智能体 2.3 配置GPTs2.4 配置外挂工具2.4.1 配置Authentication-授权2.4.1.1 生成语聚AI的…...
完美世界|单机版合集(共22个版本)
前言 我是研究单机的老罗,今天给大家带来的是完美世界的单机版合集,一共22个版本。本人亲自测试了一个版本,运行视频如下: 完美世界|单机版合集 先看所有的版本的文件,文件比较大,准备好空间,差…...
Jenkins的一些记录
设置环境变量 在 Jenkins 流水线中,取决于使用的是声明式还是脚本式流水线,设置环境变量的方法不同。 声明式流水线支持 environment 指令,而脚本式流水线的使用者必须使用 withEnv 步骤。 pipeline {agent anyenvironment { CC clang}stag…...
讲讲js中的prototype和__proto__
在Javascript中,prototype和__proto__是两个重要的概念,在对象的原型链中扮演重要的角色。 prototype prototype是js函数的内置属性,每个函数都有一个prototype属性,它是一个指针,指向一个对象(原型对象&a…...
JavaScript的学习之DOM的查询(一)
一、获得元素 通过document对象调用: getElementById():通过id属性获取一个元素节点对象getElementsByTagName():通过标签名获取一组元素节点对象getElementsByName():通过name属性来获取一组元素节点对象 核心学习代码 <scrip…...
充电宝哪个品牌比较好一点?多维度实测西圣、绿联、倍思充电宝!
在这个快节奏的时代,智能手机已成为我们日常生活不可或缺的一部分,而充电宝作为其能量补给站,重要性不言而喻。面对市场上琳琅满目的充电宝品牌与型号,如何挑选一款既实用又高效的充电伴侣,成为了许多消费者的难题。今…...
ubuntu安装QT
以QT5.15.14为例 下载地址:Index of /archive/qt 安装步骤: 解压qt-everywhere-src-5.15.14运行: cd qt-everywhere-src-5.15.14 mkdir build cd build ../configure -prefix /opt/qt5.15.14 -opensource -confirm-license make -j16 sudo…...
DataGrip 2024 po for Mac 数据库管理工具解
Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件(适合自己的M芯片版或Intel芯片版),将其从左侧拖入右侧文件夹中,等待安装完毕2、应用程序显示软件图标,表示安装成功3、打开访达,点击【文…...
《C++ Primer》导学系列:第 13 章 - 拷贝控制
13.1 拷贝、赋值与析构函数 拷贝控制是C++中类设计的重要组成部分,用于管理对象的复制、赋值和销毁过程。理解并正确实现拷贝控制函数(拷贝构造函数、拷贝赋值运算符和析构函数)对于编写健壮和高效的C++程序至关重要。 13.1.1 拷贝构造函数 拷贝构造函数用于创建对象的副…...
c++ 图论2 深度优先算法和广度优先算法
修改一下深度优先算法和广度优先算法,标出每一个节点相对于遍历起始位置的层级,遍历起始起点为第一层,和第一层相连的节点为第二层,以此类推 定义一个新的结构 struct NodeWithLevel {TreeNode* node;int level;NodeWithLevel(T…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...
Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
C语言中提供的第三方库之哈希表实现
一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...
深入理解Optional:处理空指针异常
1. 使用Optional处理可能为空的集合 在Java开发中,集合判空是一个常见但容易出错的场景。传统方式虽然可行,但存在一些潜在问题: // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
提升移动端网页调试效率:WebDebugX 与常见工具组合实践
在日常移动端开发中,网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时,开发者迫切需要一套高效、可靠且跨平台的调试方案。过去,我们或多或少使用过 Chrome DevTools、Remote Debug…...
MySQL 主从同步异常处理
阅读原文:https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主,遇到的这个错误: Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一,通常表示ÿ…...
