嵌入式Linux下的Qt移植详细过程

开发说明

前段时间需要用开发板写一个下位机程序,是基于Linux系统,就想着用Qt来写,于是上网找教程看如何移植到开发板上。由于我不熟悉嵌入式Linux,加上网上的教程大多都有不少坑,移植过程搞了几天,实在难受,故记录下移植过程,作为记录,也为需要的人提供参考。

我用来编译qt的主机是Ubuntu18系统,用的是VM虚拟机。要移植的开发板的架构是Cortex-72A。

资源以及下载地址

  1. tslib1.2.1源码(触摸屏需要用到tslib)

tslib1.2.1

  1. qt5.12.9源码

qt-everywhere-src-5.15.2.tar.xz

  1. 交叉编译器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任意一个编译器即可。

  1. 配置工具

sudo apt-get install libtool autogen autoconf automake

编译tslib

  1. 记住你用的是哪个交叉编译器进行编译的,下面编译Qt需要用到同样的交叉编译器。

  2. 解压下载好的源码,进入根目录。

  3. 进行configure

CC=/usr/bin/arm-linux-gnueabi-g++ ./configure --host=arm-linux-gnueabi --prefix=/home/tslib1.2.1

CC指定交叉编译器,host指定平台,prefix指定生成的库放在哪个目录,可以自定义。

  1. make and make install

make

然后

make install

等待make install 结束就可以在/home/tslib1.2.1目录下看到生成tslib.

编译Qt

  1. 解压qt5.12.9源码,进入根目录。

tar -vxf everywhere-src-5.12.9.tar.xz

cd everywhere-src-5.12.9

  1. 修改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-a

include(../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)

  1. 编写配置文件

新建一个脚本文件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。这个问题也搞了我挺久的。

  1. 编译

在qt源码根目录下执行刚才编写好的脚本文件,并且make && make install.

编译的过程要挺久十几分钟到几个小时不等。

chmod 777 myconfig.sh

./myconfig.sh

make -j4

make install

如果上面的过程有问题,根据提示进行修改.

移植

  1. 将生成好的tslib和qt5.12.9复制到开发板上。

![](file:///C:/Users/16877/Desktop/2022-12-09_155324.png?msec=1670572465658)

  1. 配置环境变量

修改/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/pointercal

export 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开发环境

  1. 一般不直接在开发板上开发,而是在另外的系统上编写好程序,再放到开发板上运行。

  2. 安装qcreator。Qt的IDE。

sudo apt-get install qtcreator

  1. 用上面编译好的qt5.12.9和交叉编译器配置qcreator

配置qmake(在编译好的qt/bin/)

配置交叉编译器(配置我们之前安装的交叉编译器)

生成的程序移植到开发板上运行。

一些问题

这个Qt移植会出现各种各样的问题,有些问题卡了好久,Google上也没有找到好的解决,归根到底还是不懂原理,只是照着别人的步骤来,由于别人的系统和板子和你不同,问题自然很多。不过我不是搞嵌入式方面的,只是需要用到才去搞的,所以也不深究原理。如果是研究这方面的,一定要把原理搞清楚,就不至于移植个Qt都这么麻烦。

有问题多百度和Google。

星期五女孩

嵌入式Linux Qt移植详细过程的更多相关文章

  1. 【Linux开发】【Qt开发】ARM QT移植详细步骤教程

    ARM QT移植详细步骤教程 米尔SAM9X5和A5D3X上默认的Qt版本是4.5.3,当这个版本的Qt库不能满足实际开发需求时,可通过此方法制定Qt开发.运行环境. 移植的步骤如下: 1.下载新版q ...

  2. UCOS2_STM32F1移植详细过程(一)

    Ⅰ.概述 该文写针对初学µC/OS的朋友,基于以下平台来一步一步移植µC/OS嵌入式操作系统.UCOS移植相关平台: 系统平台:µC/OS-II  (最新V2.92版) 硬件平台:STM32F1    ...

  3. 【课程分享】深入浅出嵌入式linux系统移植开发 (环境搭建、uboot的移植、嵌入式内核的配置与编译)

    深入浅出嵌入式linux系统移植开发 (环境搭建.uboot的移植.嵌入式内核的配置与编译) 亲爱的网友,我这里有套课程想和大家分享,假设对这个课程有兴趣的,能够加我的QQ2059055336和我联系 ...

  4. UCOS2_STM32F1移植详细过程(四)

    Ⅰ.概述 上一篇文章是讲述uC/OS-II Ports下面os_cpu_a.asm.os_cpu_c.c和os_cpu.h文件底层端口代码的移植(修改)和说明,接着上一篇文章来讲述关于UCOS移植应用 ...

  5. UCOS2_STM32F1移植详细过程(三)

    Ⅰ.概述 上一篇文章是讲述ST芯片相关的配置和OS裁剪相关的配置,接着上一篇文章来讲述关于UCOS的移植,该文主要针对uC/OS-II Ports下面os_cpu_a.asm.os_cpu_c.c和o ...

  6. UCOS2_STM32F1移植详细过程(二)

    Ⅰ.概述 打开上一篇文章新建的工程,是提取的ST标准库里面源代码文件和UCOS工程包源代码文件.下载过的朋友可能会知道,直接编译那个工程会有大片的错误和警告,原因在于那个工程是没有经过修改源代码的工程 ...

  7. UCOS2_STM32移植详细过程(汇总)

    Ⅰ.概述 笔者发现一个问题,很多初学者,甚至很多工作一两年的人,他们有一种依赖的思想,就是希望从别处获取的软件代码不做任何修改,直接可以运行或者使用.笔者想说,实践才是检验真理的关键,实践才是掌握知识 ...

  8. UCOS2_STM32F1移植详细过程

    源:UCOS2_STM32F1移植详细过程(三) UCOS2_STM32移植过程.系统内核.事件描述(汇总)

  9. 嵌入式linux系统移植(一)

    内容:   交叉编译环境   bootloader功能子系统   内核核心子系统   文件系统子系统要点:  搭建交叉编译环境  bootloader的选择和移植  kernel的配置.编译.移植和调 ...

  10. android wifi驱动移植详细过程

    转自:http://bbs.imp3.net/thread-10558924-1-1.html 对于刚入手android没多久的人来说,android wifi 驱动的移植确实还是有难度的,不过参考了 ...

随机推荐

  1. Winsw将jar包部署为windows服务

    1. 下载Winsw https://github.com/winsw/winsw/releases 下载winsw官网上的xml文件和.exe文件 2. 编辑配置文件 创建一个文件夹demo,将所需 ...

  2. P6189 [NOI Online #1 入门组] 跑步 (DP/根号分治)

    (才了解到根号分治这样的妙方法......) 将每个数当成一种物品,最终要凑成n,这就是一个完全背包问题,复杂度O(n2),可以得80分(在考场上貌似足够了......) 1 #include < ...

  3. P3629 [APIO2010] 巡逻 (树的直径)

    (这道题考察了求直径的两种方法......) 在原图中,每条边要经过两次,增加1条后,形成了一个环,那么环上的边只需要经过一次了(大量画图分析得),再增加一条又会形成一个环,如果这两个环有重叠,重叠部 ...

  4. 研一入坑Go 文件操作

    1 package main 2 3 import ( 4 "fmt" 5 "os" 6 "path" 7 "path/filep ...

  5. 2022最新版JDK1.8的安装教程、包含jdk1.8的提取码(亲测可用)

    文章目录 1.jdk的安装 1.1.下载(百度网盘jdk1.8提取码永久有效) 1.2.双击提取出来的exe,运行程序.如下图 1.3.进入安装向导 1.4.选择默认(安装所有的组件).同时更改安装路 ...

  6. 使用 nvm 对 node 进行版本管理

    前端项目工程化,基本都依赖于 nodejs, 不同的项目对于 nodejs 的版本会有要求,nvm 就是可以让我们在各个版本之间进行快速切换的工具. Linux 系统 下载解压 查看所有版本 , 选择 ...

  7. 十九、Service Ingress

    Service Ingress Ingress-Nginx github 地址:https://github.com/kubernetes/ingress-nginx Ingress-Nginx 官方 ...

  8. vulnhub靶场之CORROSION: 2

    准备: 攻击机:虚拟机kali.本机win10. 靶机:CORROSION: 2,网段地址我这里设置的桥接,所以与本机电脑在同一网段,下载地址:https://download.vulnhub.com ...

  9. 开源网络协议栈onps诞生记

    小孩没娘,说来话长,一切都要从LwIP说起.大约是06年9月,本人在二姨的坛口发布了一篇小文--<uC/OS-II 平台下的 LwIP 移植笔记>.自此一发不可收拾,开启了一段我与LwIP ...

  10. Python基础之函数:1、函数的介绍及名称空间

    目录 一.函数 1.什么是函数 2.函数的语法结构 3.函数的定义与调用 4.函数的分类 5.函数的返回值 6.函数的参数 二.函数参数 1.位置参数 2.默认参数 3.可变长参数 1.一个*号 2. ...