嵌入式Linux Qt移植详细过程
嵌入式Linux下的Qt移植详细过程
开发说明
前段时间需要用开发板写一个下位机程序,是基于Linux系统,就想着用Qt来写,于是上网找教程看如何移植到开发板上。由于我不熟悉嵌入式Linux,加上网上的教程大多都有不少坑,移植过程搞了几天,实在难受,故记录下移植过程,作为记录,也为需要的人提供参考。
我用来编译qt的主机是Ubuntu18系统,用的是VM虚拟机。要移植的开发板的架构是Cortex-72A。
资源以及下载地址
- tslib1.2.1源码(触摸屏需要用到tslib)
- qt5.12.9源码
qt-everywhere-src-5.15.2.tar.xz
- 交叉编译器aarch64-linux-gnu-gcc/aarch64-linux-gnu-g++或者gcc-arm-linux-gnueabi
sudo apt-get install aarch64-linux-gnu-gcc
sudo apt-get install aarch64-linux-gnu-g++
sudo apt-get install gcc-arm-linux-gnueabi
sudo apt-get install g++-arm-linux-gnueabi
或者去官网ARM 直接下载你需要的交叉编译器。安装aarch64或者gnueabi任意一个编译器即可。
- 配置工具
sudo apt-get install libtool autogen autoconf automake
编译tslib
记住你用的是哪个交叉编译器进行编译的,下面编译Qt需要用到同样的交叉编译器。
解压下载好的源码,进入根目录。
进行configure
CC=/usr/bin/arm-linux-gnueabi-g++ ./configure --host=arm-linux-gnueabi --prefix=/home/tslib1.2.1
CC指定交叉编译器,host指定平台,prefix指定生成的库放在哪个目录,可以自定义。
- make and make install
make
然后
make install
等待make install 结束就可以在/home/tslib1.2.1目录下看到生成tslib.
编译Qt
- 解压qt5.12.9源码,进入根目录。
tar -vxf everywhere-src-5.12.9.tar.xz
cd everywhere-src-5.12.9
- 修改qmake.conf
我用的交叉编译器是linux-arm-gnueabi-g++,所以进入qt源码目录下的/qtbase/mkspecs/linux-arm-gnueabi-g++/ 找到qmake.conf进行修改。
如果你用的是其它交叉编译器,那需要进入到对应编译器的目录修改
aarch64进入qtbase/mkspecs/linux-aarch64-gun-g++/
其它找对应目录即可。
qmake.conf添加以下三行:
QT_QPA_DEFAULT_PLATFORM = linuxfb
QMAKE_CFLAGS_RELEASE += -O2 -march=armv8-a
QMAKE_CXXFLAGS_RELEASE += -O2 -march=armv8-a
修改后:
AKEFILE_GENERATOR = UNIX
CONFIG += incremental
QMAKE_INCREMENTAL_STYLE = sublib# 添加以下三行
QT_QPA_DEFAULT_PLATFORM = linuxfb
QMAKE_CFLAGS_RELEASE += -O2 -march=armv8-a
QMAKE_CXXFLAGS_RELEASE += -O2 -march=armv8-ainclude(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)# modifications to g++.conf
QMAKE_CC = arm-linux-gnuebai-gcc # 指定编译器
QMAKE_CXX = arm-linux-gnuebai-g++
QMAKE_LINK = arm-linux-gnuebai-g++
QMAKE_LINK_SHLIB = arm-linux-gnuebai-g++# modifications to linux.conf
QMAKE_AR =arm-linux-gnuebai-ar cqs
QMAKE_OBJCOPY = arm-linux-gnuebai-objcopy
QMAKE_NM = arm-linux-gnuebai-nm -P
QMAKE_STRIP = arm-linux-gnuebai-strip
load(qt_config)
- 编写配置文件
新建一个脚本文件myconfig.sh,写入以下内容。有几项需要根据自己情况修改
-prefix 指定生成文件的目录
-l/home/tslib1.2.1/include 修改成上面编译好的tslib对应路径
-L/home/tslib1.2.1/lib 修改成上面编译好的tslib对应路径
-xplatform 平台目标,交叉编译时的目标平台
configure参数的意思用法参考 Qt configure参数详解 .
./configure -prefix /home/forlinx/qt5.12.9
-opensource
-confirm-license
-release
-strip
-shared
-xplatform linux-arm-gnuabi-g++
-optimized-qmake
-c++std c++11
--rpath=no
-pch
-skip qt3d
-skip qtactiveqt
-skip qtandroidextras
-skip qtcanvas3d
-skip qtconnectivity
-skip qtdatavis3d
-skip qtdoc
-skip qtgamepad
-skip qtlocation
-skip qtmacextras
-skip qtnetworkauth
-skip qtpurchasing
-skip qtremoteobjects
-skip qtscript
-skip qtscxml
-skip qtsensors
-skip qtspeech
-skip qtsvg
-skip qttools
-skip qttranslations
-skip qtwayland
-skip qtwebengine
-skip qtwebview
-skip qtwinextras
-skip qtx11extras
-skip qtxmlpatterns
-skip qtdeclarative
-make libs
-make examples
-nomake tools -nomake tests
-gui
-widgets
-dbus-runtime
--glib=no
--iconv=no
--pcre=qt
--zlib=qt
-no-openssl
--freetype=qt
--harfbuzz=qt
-no-opengl
-linuxfb
--xcb=no
-tslib
--libpng=qt
--libjpeg=qt
--sqlite=qt
-plugin-sql-sqlite
-I/home/tslib1.2.1/include
-L/home/tslib1.2.1/lib
-recheck-all
这里注意一下格式,如果你从windows复制脚本到虚拟机的linux下,那个换行格式可能导致configure的时候有错误. Windows下换行是\r\n 。linux下是\n。这个问题也搞了我挺久的。
- 编译
在qt源码根目录下执行刚才编写好的脚本文件,并且make && make install.
编译的过程要挺久十几分钟到几个小时不等。
chmod 777 myconfig.sh
./myconfig.sh
make -j4
make install
如果上面的过程有问题,根据提示进行修改.
移植
- 将生成好的tslib和qt5.12.9复制到开发板上。
![](file:///C:/Users/16877/Desktop/2022-12-09_155324.png?msec=1670572465658)
- 配置环境变量
修改/etc/profile文件,在末尾添加以下内容。
路径根据自己情况修改
TSLIB_ROOT tslib的路径
QT_ROOT qt 的路径
export TSLIB_ROOT=/root/qtres/tslib_result
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_TSDEVICE=/dev/input/event0
export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf
export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts
export TSLIB_CALIBFILE=/etc/pointercalexport QT_ROOT=/root/qtres/qt5.12.9
export QT_QPA_GENERIC_PLUGINS=tslib:/dev/input/event0
export QT_QPA_FONTDIR=/usr/share/fonts
export QT_QPA_PLATFORM_PLUGIN_PATH=$QT_ROOT/plugins
export QT_QPA_PLATFORM=linuxfb:tty=/dev/fb0
export QT_PLUGIN_PATH=$QT_ROOT/plugins
export LD_LIBRARY_PATH=$QT_ROOT/lib:$QT_ROOT/plugins/platforms:$TSLIB_ROOT/lib:$QT_ROOT/bin
export QML2_IMPORT_PATH=$QT_ROOT/qml
export QT_QPA_FB_TSLIB=1
使文件生效.
source /etc/profile
到此,qt5.12.9移植完成。
配置QCreator开发环境
一般不直接在开发板上开发,而是在另外的系统上编写好程序,再放到开发板上运行。
安装qcreator。Qt的IDE。
sudo apt-get install qtcreator
- 用上面编译好的qt5.12.9和交叉编译器配置qcreator
配置qmake(在编译好的qt/bin/)
配置交叉编译器(配置我们之前安装的交叉编译器)
生成的程序移植到开发板上运行。
一些问题
这个Qt移植会出现各种各样的问题,有些问题卡了好久,Google上也没有找到好的解决,归根到底还是不懂原理,只是照着别人的步骤来,由于别人的系统和板子和你不同,问题自然很多。不过我不是搞嵌入式方面的,只是需要用到才去搞的,所以也不深究原理。如果是研究这方面的,一定要把原理搞清楚,就不至于移植个Qt都这么麻烦。
有问题多百度和Google。
星期五女孩
嵌入式Linux Qt移植详细过程的更多相关文章
- 【Linux开发】【Qt开发】ARM QT移植详细步骤教程
ARM QT移植详细步骤教程 米尔SAM9X5和A5D3X上默认的Qt版本是4.5.3,当这个版本的Qt库不能满足实际开发需求时,可通过此方法制定Qt开发.运行环境. 移植的步骤如下: 1.下载新版q ...
- UCOS2_STM32F1移植详细过程(一)
Ⅰ.概述 该文写针对初学µC/OS的朋友,基于以下平台来一步一步移植µC/OS嵌入式操作系统.UCOS移植相关平台: 系统平台:µC/OS-II (最新V2.92版) 硬件平台:STM32F1 ...
- 【课程分享】深入浅出嵌入式linux系统移植开发 (环境搭建、uboot的移植、嵌入式内核的配置与编译)
深入浅出嵌入式linux系统移植开发 (环境搭建.uboot的移植.嵌入式内核的配置与编译) 亲爱的网友,我这里有套课程想和大家分享,假设对这个课程有兴趣的,能够加我的QQ2059055336和我联系 ...
- UCOS2_STM32F1移植详细过程(四)
Ⅰ.概述 上一篇文章是讲述uC/OS-II Ports下面os_cpu_a.asm.os_cpu_c.c和os_cpu.h文件底层端口代码的移植(修改)和说明,接着上一篇文章来讲述关于UCOS移植应用 ...
- UCOS2_STM32F1移植详细过程(三)
Ⅰ.概述 上一篇文章是讲述ST芯片相关的配置和OS裁剪相关的配置,接着上一篇文章来讲述关于UCOS的移植,该文主要针对uC/OS-II Ports下面os_cpu_a.asm.os_cpu_c.c和o ...
- UCOS2_STM32F1移植详细过程(二)
Ⅰ.概述 打开上一篇文章新建的工程,是提取的ST标准库里面源代码文件和UCOS工程包源代码文件.下载过的朋友可能会知道,直接编译那个工程会有大片的错误和警告,原因在于那个工程是没有经过修改源代码的工程 ...
- UCOS2_STM32移植详细过程(汇总)
Ⅰ.概述 笔者发现一个问题,很多初学者,甚至很多工作一两年的人,他们有一种依赖的思想,就是希望从别处获取的软件代码不做任何修改,直接可以运行或者使用.笔者想说,实践才是检验真理的关键,实践才是掌握知识 ...
- UCOS2_STM32F1移植详细过程
源:UCOS2_STM32F1移植详细过程(三) UCOS2_STM32移植过程.系统内核.事件描述(汇总)
- 嵌入式linux系统移植(一)
内容: 交叉编译环境 bootloader功能子系统 内核核心子系统 文件系统子系统要点: 搭建交叉编译环境 bootloader的选择和移植 kernel的配置.编译.移植和调 ...
- android wifi驱动移植详细过程
转自:http://bbs.imp3.net/thread-10558924-1-1.html 对于刚入手android没多久的人来说,android wifi 驱动的移植确实还是有难度的,不过参考了 ...
随机推荐
- 天翼云上新增IP备案具体操作步骤
0.点击右上角的备案,进入到备案中心 1.已备案信息管理 点击左侧的已备案信息管理,右侧出现的页面中找到已备案网站信息,网站负责人后面的操作里有5个图标,点击第三个(变更接入),提交订单,进入到下一步 ...
- 第五章:Admin管理后台 - 1:自定制Admin
如果只是在admin中简单的展示及管理模型,那么在admin.py模块中使用admin.site.register将模型注册一下就好了: from django.contrib import admi ...
- 安装jumpserver 2.1.2版本遇到的坑
官方文档地址:https://docs.jumpserver.org/zh/master/install/step_by_step/ Jumpserver 对外需要开放 80 和 2222 端口,如果 ...
- 在项目中自定义集成IdentityService4
OAuth2.0协议 在开始之前呢,需要我们对一些认证授权协议有一定的了解. OAuth 2.0 的一个简单解释 http://www.ruanyifeng.com/blog/2019/04/oaut ...
- PHP全栈开发(八):CSS Ⅹ 导航栏制作
学习了这么久的CSS,我们现在也可以小试牛刀一下了,我们使用我们学会的CSS知识来制作一个导航栏. 我们都知道,在现代的导航栏里面,最普遍的就是使用无序列表来制作导航栏. 我们可以使用如下代码来制作一 ...
- 如何用AR Engine环境Mesh能力实现虚实遮挡
在AR应用中,用户最不希望看到不真实的穿模现象发生,如虚拟形象部分身体陷入墙壁之中,或者未碰到墙壁却已无法移动,这种不真实的交互十分影响用户体验.那如何才能让避免虚拟物体的穿模问题呢?使用AR Eng ...
- 驱动开发:内核中实现Dump进程转储
多数ARK反内核工具中都存在驱动级别的内存转存功能,该功能可以将应用层中运行进程的内存镜像转存到特定目录下,内存转存功能在应对加壳程序的分析尤为重要,当进程在内存中解码后,我们可以很容易的将内存镜像导 ...
- RAID5 IO处理之写请求代码详解
我们知道RAID5一个条带上的数据是由N个数据块和1个校验块组成,其校验块由N个数据块通过异或运算得出,这样才能在任意一个成员磁盘失效时通过其他N个成员磁盘恢复出用户写入的数据.这也就要求RAID5条 ...
- JavaScript基础&实战(3)js中的流程控制语句、条件分支语句、for循环、while循环
文章目录 1.流程控制语句 1.1 代码 1.2 测试结果 2.弹窗提示输入内容 2.1 代码 2.2 测试结果 3.条件分支语句 3.1 代码 3.2 测试结果 4.while和 do...whil ...
- CSS clear both清除浮动
.clear{clear:both;} <div class="clear"></div>