linux GUI-移植Qt5.6到mini2440
目录
----------------------------------------------------------------------------------------------------------------------------
内核版本:linux 5.2.8
根文件系统:busybox 1.25.0
u-boot:2016.05
开发板:Mini2440
宿主机:Ubuntu 16.04.7 LTS
----------------------------------------------------------------------------------------------------------------------------
为实现目标嵌入式平台能够正常运行Qt程序,则需要在目标平台上部署Qt运行环境。
一、Qt编译和安装
1.1 Qt版本介绍
Qt的版本比较多,容易搞混。现分别介绍:
- Qt/X11 :指用于Linux/Unix的版本。如:我们常用的qt-x11-opensource-src-4.5.3.tar.gz,它是用于PC机linux平台的Qt源码;
- Qt Windows:指用于Windows的版本;
- qt-everywhere:指(在配置时加上不同的参数)既可用于x86,也可用于ARM,如qt-everywhere-opensource-src-4.7.0.tar.gz、qt-everywhere-opensource-src-4.6.1.tar.gz;从Qt4.6开始提供这种源码包;
- Qt/Embedded:指用于ARM平台的版本。如qt-embedded-linux-opensource-src-4.5.3.tar.gzz是用于嵌入式ARM的qt源码包;从Qt4.1开始,Qt/Embedded改名为Qtopia Core,又从Qt4.4.1开始,Qtopia Core又改名为Qt for Embedded Linux,一般发行的源码包的名字叫做:qt-embeded-linux-xxxxxx,但是自动Qt4.6开始就不再提供这种源码包了,而是开始提供qt-everywhere源码包;
1.2 qt-everywhere下载
这里我们下载qt-everywhere,这里我们不去选择较新版本,主要由于新版本已经不支持ARMv4t架构了,我们下载5.6版本源码包即可。
国内镜像站点下载地址:
- https://download.qt.io/archive(官方)
- University of Science and Technology of China (推荐,旧版本较全)
- 清华大学开源软件镜像站
在ubuntu服务器上下载程序包:
root@zhengyang:/work/sambashare# cd tools root@zhengyang:/work/sambashare/tools# wget https://download.qt.io/new_archive/qt/5.6/5.6.0/single/qt-everywhere-opensource-src-5.6.0.tar.xz
下载完后,解压程序包:
root@zhengyang:/work/sambashare/tools# tar -xvf qt-everywhere-opensource-src-5.6.0.tar.xz
1.3 修改qmake.conf
进入 qt-everywhere-opensource-src-5.6.0文件夹,针对Mini2440开发板,修改qmake.conf文件:
root@zhengyang:/work/sambashare/tools# cd qt-everywhere-opensource-src-5.6.0/
root@zhengyang:/work/sambashare/tools/qt-everywhere-opensource-src-5.6.0/# vim qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf
源文件内容如下:
# # qmake configuration for building with arm-linux-gnueabi-g++ # MAKEFILE_GENERATOR = UNIX CONFIG += incremental QMAKE_INCREMENTAL_STYLE = sublib include(../common/linux.conf) include(../common/gcc-base-unix.conf) include(../common/g++-unix.conf) # modifications to g++.conf QMAKE_CC = arm-linux-gnueabi-gcc QMAKE_CXX = arm-linux-gnueabi-g++ QMAKE_LINK = arm-linux-gnueabi-g++ QMAKE_LINK_SHLIB = arm-linux-gnueabi-g++ # modifications to linux.conf QMAKE_AR = arm-linux-gnueabi-ar cqs QMAKE_OBJCOPY = arm-linux-gnueabi-objcopy QMAKE_NM = arm-linux-gnueabi-nm -P QMAKE_STRIP = arm-linux-gnueabi-strip load(qt_config)
我们需要根据我们安装得交叉编译工具去修改,由于我之前安装的是arm-linux-gcc 4.8.3,
所以这里我们需要按照我们安装的交叉编译工具来修改QMAKE_CC、QMAKE_CXX等配置项:需要指定全路径。
# # qmake configuration for building with arm-linux-gnueabi-g++ # MAKEFILE_GENERATOR = UNIX CONFIG += incremental QMAKE_INCREMENTAL_STYLE = sublib Qt_QPA_DEFAULT_PLATFORM = linuxfb QMAKE_CFLAGS += -msoft-float -D__GCC_FLOAT_NOT_NEEDED # 由于硬件不支持浮点运算,所以采用软件模拟浮点运算 QMAKE_CXXFLAGS += -msoft-float -D__GCC_FLOAT_NOT_NEEDED # 由于硬件不支持浮点运算,所以采用软件模拟浮点运算 QMAKE_CXXFLAGS += -O0 # g++ 不优化 编译会很慢 QMAKE_CXXFLAGS -= -O1 QMAKE_CXXFLAGS -= -O2 QMAKE_CXXFLAGS -= -O3 QMAKE_CFLAGS += -O0 # gcc 不优化 QMAKE_CFLAGS -= -O1 QMAKE_CFLAGS -= -O2 QMAKE_CFLAGS -= -O3 include(../common/linux.conf) include(../common/gcc-base-unix.conf) include(../common/g++-unix.conf) # modifications to g++.conf QMAKE_CC = /usr/local/arm/4.8.3/bin/arm-none-linux-gnueabi-gcc -march=armv4t -mtune=arm920t QMAKE_CXX = /usr/local/arm/4.8.3/bin/arm-none-linux-gnueabi-g++ -march=armv4t -mtune=arm920t QMAKE_LINK = /usr/local/arm/4.8.3/bin/arm-none-linux-gnueabi-g++ -march=armv4t -mtune=arm920t QMAKE_LINK_SHLIB = /usr/local/arm/4.8.3/bin/arm-none-linux-gnueabi-g++ -march=armv4t -mtune=arm920t # modifications to linux.conf QMAKE_AR = /usr/local/arm/4.8.3/bin/arm-none-linux-gnueabi-ar cqs QMAKE_OBJCOPY = /usr/local/arm/4.8.3/bin/arm-none-linux-gnueabi-objcopy QMAKE_NM = /usr/local/arm/4.8.3/bin/arm-none-linux-gnueabi-nm -P QMAKE_STRIP = /usr/local/arm/4.8.3/bin/arm-none-linux-gnueabi-strip load(qt_config)
1.4 配置安装
1.4.1 CMake安装
CMake是一个跨平台的构建工具,其支持程度要好于qmake。CMake的配置更加灵活、强大,也更容易维护。如果是Qt6.0+需要安装CMake,否则忽略即可。
注:是一个比make更高级的编译配置工具,它可以根据不同平台、不同的编译器,生成相应的Makefile或者vcproj项目。
接着回到安装目录,安装CMake:
root@zhengyang:/work/sambashare# cd /work/sambashare/tools root@zhengyang:/work/sambashare/tools# wget https://github.com/Kitware/CMake/releases/download/v3.21.2/cmake-3.21.2.tar.gz root@zhengyang:/work/sambashare/tools# tar xf cmake-3.21.2.tar.gz root@zhengyang:/work/sambashare/tools# cd cmake-3.21.2 root@zhengyang:/work/sambashare/tools/cmake-3.21.2# ./configure root@zhengyang:/work/sambashare/tools/cmake-3.21.2# make && make install root@zhengyang:/work/sambashare/tools/cmake-3.21.2# cd .. root@zhengyang:/work/sambashare/tools# rm -rf cmake-3.21.2
这里我们没有指定安装路径,默认是安装到了 /usr/local/bin路径。
root@zhengyang:/work/sambashare/tools# ll /usr/local/bin 总用量 47556 drwxr-xr-x 2 root root 4096 5月 7 13:45 ./ drwxr-xr-x 19 root root 4096 5月 7 13:48 ../ -rwxr-xr-x 1 root root 11319992 5月 7 13:45 ccmake* -rwxr-xr-x 1 root root 11589232 5月 7 13:45 cmake* -rwxr-xr-x 1 root root 12030672 5月 7 13:45 cpack* -rwxr-xr-x 1 root root 13098200 5月 7 13:45 ctest* -rwxr-xr-x 1 root root 230408 8月 27 2022 ffmpeg* -rwxr-xr-x 1 root root 123424 8月 27 2022 ffplay* -rwxr-xr-x 1 root root 139168 8月 27 2022 ffprobe* -rwxr-xr-x 1 root root 136720 8月 27 2022 ffserver* -rwxr-xr-x 1 root root 1568 8月 27 2022 sdl2-config*
1.4.2 tslib安装
要想Qt 支持触摸需要编译tslib ,以生成触摸相关插件。 tslib 多用于嵌入式系统中,是基本的触摸插件。在上一节linux设备树-LCD触摸屏设备驱动已经介绍了tslib的安装,这里不重复介绍了,当时我们将tslib安装到了ls /work/sambashare/drivers/tslib/tmp/路径下。
我们将其拷贝到/usr/local/tslib路径下:
root@zhengyang:/work/sambashare# ls drivers/tslib/tmp/ bin/ etc/ include/ lib/ share/ root@zhengyang:/work/sambashare# cp drivers/tslib/tmp/* /usr/local/tslib/ -rfd
1.4.3 Qt安装
接着回到Qt安装目录:
root@zhengyang:/work/sambashare# cd tools/qt-everywhere-opensource-src-5.6.0 root@zhengyang:/work/sambashare/tools/qt-everywhere-opensource-src-5.6.0# sudo mkdir -p /usr/local/qt5.6
接下来配置Qt, 在Qt的源码目录下有一个可执行程序 configure, 运行./configure --help 可以看到详细的配置选项。
为了操作方便,可以写一个脚本文件autoconfigure.sh,文容如下:
sudo ./configure -prefix /usr/local/qt5.6 \ -v \ -opensource \ -release \ -confirm-license \ -xplatform linux-arm-gnueabi-g++ \ -shared \ -qt-zlib \ -no-gif \ -qt-libjpeg \ -no-nis \ -no-opengl \ -no-cups \ -no-glib \ -no-dbus \ -no-rpath \ -no-sse2 -no-sse3 -no-ssse3 -no-sse4.1 -no-sse4.2 \ -no-avx \ -no-openssl \ -nomake tools \ -qreal float \ -qt-libpng \ -tslib \ -nomake examples \ -I /usr/local/tslib/include \ -L /usr/local/tslib/lib
-I和-L分别指定头文件目录和库目录,在安装tslib生成的目录tmp中,这里提前将tmp目录复制到/usr/local/tslib中。
赋予配置脚本autoconfigure.sh 可执行权限,然后执行
root@zhengyang:/work/sambashare/tools/qt-everywhere-opensource-src-5.6.0# sudo apt-get install g++ #配置前请先安装g++,如已安装可忽略 root@zhengyang:/work/sambashare/tools/qt-everywhere-opensource-src-5.6.0# chmod +x autoconfigure.sh root@zhengyang:/work/sambashare/tools/qt-everywhere-opensource-src-5.6.0# ./autoconfigure.sh
配置脚本运行完成之后,就可以进行编译和安装了,大约需要十几到几十分钟:
root@zhengyang:/work/sambashare/tools/qt-everywhere-opensource-src-5.6.0# make -j4 root@zhengyang:/work/sambashare/tools/qt-everywhere-opensource-src-5.6.0# make install
注意:make -j4编译时间较长,而且可能出现各种问题,我们先把一些库装下来(不管它有用没用),不然一make就是半小时,实在没那个精力去试哪个没用,建议全部安装。
root@zhengyang:/work/sambashare# sudo apt-get install lib32z1 root@zhengyang:/work/sambashare# sudo apt-get install lib32ncurses5 root@zhengyang:/work/sambashare# sudo apt-get install libncurses5-dev libncursesw5-dev root@zhengyang:/work/sambashare# sudo apt-get install lib32stdc++6 root@zhengyang:/work/sambashare# sudo apt-get install libc6-dev root@zhengyang:/work/sambashare# sudo apt-get install libqt5serialport5-dev libudev-dev root@zhengyang:/work/sambashare# sudo apt-get install dbus root@zhengyang:/work/sambashare# sudo apt-get install libjpeg-dev
安装完成后查看安装的文件夹:
root@zhengyang:/work/sambashare/tools/qt-everywhere-opensource-src-5.6.0# ls /usr/local/qt5.6 bin doc include lib mkspecs plugins qml translations
1.5 打包
将 qt5.6文件夹拷贝到根文件系统所在目录,以备移植开发板时使用:
root@zhengyang:/work/sambashare# cd /usr/local root@zhengyang:/usr/local# cp -rfd qt5.6 qt5.6-1 #建立一个副本 root@zhengyang:/usr/local/qt5.6# cd qt5.6 root@zhengyang:/usr/local/qt5.6# rm -rf doc include bin mkspecs qml translations root@zhengyang:/usr/local/qt5.6# cd .. root@zhengyang:/usr/local# mkdir -p /work/nfs_root/rootfs/usr/local/ root@zhengyang:/usr/local# cp -rfd qt5.6 /work/nfs_root/rootfs/usr/local/ #拷贝到根文件系统/usr/local/qt5.6下 root@zhengyang:/usr/local# rm -rf qt5.6 && mv qt5.6-1 qt5.6 #删除库目录并将副本名字改回来
不能直接将lib和plugins目录复制到根文件系统中,这样制作出根文件系统后文件太大,一般会超过了SDRAM的大小64M,uboot烧写文件系统的程序是一次将程序完整读到内存再烧写的,所以无法烧写到Nand Flash。如果用NFS启动当然就没有这些问题。
root@zhengyang:/usr/local# ls -l /work/nfs_root/rootfs/usr/local/qt5.6/ 总用量 16 drwxr-xr-x 5 root root 12288 5月 7 18:30 lib drwxr-xr-x 15 root root 4096 5月 7 18:30 plugins
注意:我的根文件系统存放在/work/nfs_root/rootfs文件夹,有关根文件系统的搭建参考Mini2440之linux内核移植之yaffs2根文件系统移植。
1.6 配置环境变量
最后在根文件系统添加Qt的环境变量:
root@zhengyang:/usr/local# vim /work/nfs_root/rootfs/etc/profile
添加如下内容:
export QtEDIR=/usr/local/qt5.6 export LD_LIBRARY_PATH=/usr/local/qt5.6/lib:$LD_LIBRARY_PATH export Qt_QPA_GENERIC_PLUGINS=tslib export Qt_QPA_FONTDIR=$QtEDIR/lib/fonts export Qt_QPA_PLATFORM_PLUGIN_PATH=$QtEDIR/plugins export Qt_QPA_PLATFORM=linuxfb:fb=/dev/fb0:size=240x320:offset=0x0:tty=/dev/tty1 export Qt_QPA_FB_TSLIB=1 export LD_PRELOAD=/lib/preloadable_libiconv.so
这里在根文件系统中配置了Qt的安装路径、库函数路径等。最后一行配置了preloadable_libiconv.so,libiconv是一个常用的编码转换库,支持常用的多种编码之间的转换。在Linux下,工具链gcc有专门的libiconv库,所有不用移植,但在arm-linux下就没那么幸运了,需要我们额外移植libiconv库,不过,过程还是比较简单的。
1.7 libiconv库安装
1.7.1 下载源码
root@zhengyang:/work/sambashare# cd /work/sambashare/tools/ root@zhengyang:/work/sambashare/tools# wget https://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz root@zhengyang:/work/sambashare/tools# mkdir -p /usr/local/libiconv root@zhengyang:/work/sambashare/tools# tar xzvf libiconv-1.14.tar.gz
1.7.2 配置
进入源码进行配置:
root@zhengyang:/work/sambashare/tools# cd libiconv-1.14 root@zhengyang:/work/sambashare/tools/libiconv-1.14# CC=arm-linux-gcc ./configure --host=arm-linux --prefix=/usr/local/libiconv CFLAGS="-march=armv4t -O2 -Wall -W" --enable-static
1.7.3 编译安装
root@zhengyang:/work/sambashare/tools/libiconv-1.14# make
编译出现如下错误:
In file included from progname.c:26:0: ./stdio.h:1010:1: error: 'gets' undeclared here (not in a function) _GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead"); ^ Makefile:914: recipe for target 'progname.o' failed make[2]: *** [progname.o] Error 1 make[2]: Leaving directory '/work/sambashare/tools/libiconv-1.14/srclib' Makefile:865: recipe for target 'all' failed
在本目录中执行:vim srclib/stdio.in.h文件,接着搜索下面这一行:
_GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");
然后把这个替换成:
#if defined(__GLIBC__) && !defined(__UCLIBC__) && !__GLIBC_PREREQ(2, 16) _GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead"); #endif
重新编译安装:
root@zhengyang:/work/sambashare/tools/libiconv-1.14# make root@zhengyang:/work/sambashare/tools/libiconv-1.14# make install root@zhengyang:/work/sambashare/tools/libiconv-1.14# cd /usr/local/libiconv/lib /usr/local/libiconv/lib# cp preloadable_libiconv.so /work/nfs_root/rootfs/lib #拷贝到文件系统
二、 安装Qt Creator
2.1 下载安装包
下载Qt Creator 5.6到Ubuntu中:
root@zhengyang:/usr/local# cd /work/sambashare/tools root@zhengyang:/work/sambashare/tools# wget https://download.qt.io/new_archive/qt/5.6/5.6.0/qt-opensource-linux-x64-5.6.0.run
qt-opensource-linux-x64-5.6.0.run为Linux安装包,由于官网下载较慢,可以通过CSDN下载5.6.2版本。
2.2 修改权限并安装
需要在ubuntu桌面环境,打开终端运行:
zhengyang@zhengyang:/work/sambashare/tools$ sudo chmod 777 qt-opensource-linux-x64-5.6.0.run zhengyang@zhengyang:/work/sambashare/tools$ sudo ./qt-opensource-linux-x64-5.6.0.run
按回车键执行安装命令后,弹出软件安装界面,如下所示:
点击下一步,弹出界面如下所示,此界面可不设置,直接点击Skip按钮:
一直下一步,直到安装完成,如下图所示:
安装完成后,输入如下命令,打开Qt Creator的开发界面:
zhengyang@zhengyang:/work/sambashare/tools$ cd /opt/Qt5.6.0/Tools/QtCreator/bin/ zhengyang@zhengyang:/opt/Qt5.6.0/Tools/QtCreator/bin$ ls qbs qbs-config-ui qbs-setup-android qbs-setup-toolchains qtcreator qbs-config qbs-qmltypes qbs-setup-qt qt.conf qtcreator.sh zhengyang@zhengyang:/opt/Qt5.6.0/Tools/QtCreator/bin$ sudo ./qtcreator
2.3 配置
点击【工具】-【选项】:
2.3.1 编译器
点击左侧【构建和运行】,选择【编译器】,添加GCC编译器:
亲爱的读者和支持者们,自动博客加入了打赏功能,陆陆续续收到了各位老铁的打赏。在此,我想由衷地感谢每一位对我们博客的支持和打赏。你们的慷慨与支持,是我们前行的动力与源泉。
日期 | 姓名 | 金额 |
---|---|---|
2023-09-06 | *源 | 19 |
2023-09-11 | *朝科 | 88 |
2023-09-21 | *号 | 5 |
2023-09-16 | *真 | 60 |
2023-10-26 | *通 | 9.9 |
2023-11-04 | *慎 | 0.66 |
2023-11-24 | *恩 | 0.01 |
2023-12-30 | I*B | 1 |
2024-01-28 | *兴 | 20 |
2024-02-01 | QYing | 20 |
2024-02-11 | *督 | 6 |
2024-02-18 | 一*x | 1 |
2024-02-20 | c*l | 18.88 |
2024-01-01 | *I | 5 |
2024-04-08 | *程 | 150 |
2024-04-18 | *超 | 20 |
2024-04-26 | .*V | 30 |
2024-05-08 | D*W | 5 |
2024-05-29 | *辉 | 20 |
2024-05-30 | *雄 | 10 |
2024-06-08 | *: | 10 |
2024-06-23 | 小狮子 | 666 |
2024-06-28 | *s | 6.66 |
2024-06-29 | *炼 | 1 |
2024-06-30 | *! | 1 |
2024-07-08 | *方 | 20 |
2024-07-18 | A*1 | 6.66 |
2024-07-31 | *北 | 12 |
2024-08-13 | *基 | 1 |
2024-08-23 | n*s | 2 |
2024-09-02 | *源 | 50 |
2024-09-04 | *J | 2 |
2024-09-06 | *强 | 8.8 |
2024-09-09 | *波 | 1 |
2024-09-10 | *口 | 1 |
2024-09-10 | *波 | 1 |
2024-09-12 | *波 | 10 |
2024-09-18 | *明 | 1.68 |
2024-09-26 | B*h | 10 |
2024-09-30 | 岁 | 10 |
2024-10-02 | M*i | 1 |
2024-10-14 | *朋 | 10 |
2024-10-22 | *海 | 10 |
2024-10-23 | *南 | 10 |
2024-10-26 | *节 | 6.66 |
2024-10-27 | *o | 5 |
2024-10-28 | W*F | 6.66 |
2024-10-29 | R*n | 6.66 |
2024-11-02 | *球 | 6 |
2024-11-021 | *鑫 | 6.66 |
2024-11-25 | *沙 | 5 |
2024-11-29 | C*n | 2.88 |

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2018-05-07 第十九节,使用RNN实现一个退位减法器
2018-05-07 深度学习系列经典博客收藏