【实战】移植QT5.6.0到嵌入式linuxS3C2440单板
2019-07-12 16:33发布
生成海报
欢迎扫码关注微信公众号:柒零玖嵌入式,更多嵌入式软硬件相关分享! 目前网上关于QT5.6的移植教程还不完善,本博客详细说明QT5.6.0移植到嵌入式linux单板的详细步骤。并将移植好的分享在GitHub上。一、实验环境
(1)编译工具链arm-Linux-gcc-4.4.3.tar.gz(2)linux系统linux-3.4.2(3)虚拟机16.04.1-Ubuntu(4)busyboxbusybox-1.22.1.tar.bz2 (5)tslib tslib-1.4.tar.gz(6)qt5.6 源码qt-everywhere-opensource-src-5.6.0.tar.gz(7)S3C2440开发板嵌入式板子是自己在JZ2440的基础上制作的。完全兼容JZ2440。
二、搭建ubuntu虚拟机系统
到https://www.ubuntu.com/index_kylin 下载16.04版本的ubuntu镜像文件。 参考《百问网精智JZ2440开发板4.3寸LCD版使用手册》安装虚拟机里常用的软件。①更新软件源$ sudo apt-get update②安装、配置、启动 ftp 服务。执行以下命令安装,安装后即会自动运行:$ sudo apt-get install vsftpd修改 vsftpd 的配置文件/etc/vsftpd.conf,将下面几行前面的“#”号去掉。#local_enable=YES#write_enable=YES上面第一行表示是否允许本地用户登录,第二行表示是否允许上传文件。修改完华之后,执行以下命令重启 ftp 服务:$ sudo /etc/init.d/vsftpd restart③安装、配置、启动 ssh 服务。执行以下命令安装, 安装后即会自动运行:$ sudo apt-get install openssh-server它的配置文件为/etc/ssh/sshd_config,使用默认配置即可。④安装、配置、启动 nfs 服务。执行以下命令安装,安装后即会自动运行:$ sudo apt-get install nfs-kernel-serverportmap它的配置文件为/etc/exports,在里面增加以下内容,以后将通过网络文件系统访问/work/nfs_root 目录:/work/nfs_root *(rw,sync,no_root_squash)修改完华之后,执行以下命令重启 nfs 服务:$ sudo /etc/init.d/nfs-kernel-serverrestart⑤安装、配置 tftp 服务软件:$ sudo apt-get install openbsd-inetdtftpdtftp打开/etc/inetd.conf 文件,里面有一行如下:tftp dgram udp wait nobody /usr/sbin/tcpd/usr/sbin/in.tftpd /srv/tftp把“nobody”改为“root”,把“/srv/tftp”改为“/work/nfs_root”,表示 tftp 目录。⑥使用以下命令安装基本的开发环境:$ sudo apt-get install build-essentialtexinfo⑦安装工具 bison、flex,它们分别是语法、词法分析器:$ sudo apt-get install bison flex libtoolautomake autoconf⑧安装 C 函数库的 man 手册,以后就可以通过类似“man read”的命令查看函数的用法了:$ sudo apt-get install manpages-dev三、安装交叉编译器
(1)解压tar zxvf arm-linux-gcc-4.4.3.tar.gz -C /(2)查看解压路径ls /opt/FriendlyARM/toolschain/4.4.3/bin(3)修改环境变量sudo vi /etc/environment改为:PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/opt/FriendlyARM/toolschain/4.4.3/bin"(4)重启系统reboot(5)查看版本arm-linux-gcc –vgcc version 4.4.3 (ctng-1.6.1)四、编译内核
编译过程中可能出现各种错误,原因是虚拟机少安装了环境,其中一些问题在如下博客中总结:http://blog.csdn.net/fengyuwuzu0519/article/details/72834451实验的时候,使用的是我按毕业班自己移植的linux3.4.2,下面说一下按毕业班的资料,如何产生所需内核(1)解压内核目录 tar jxvf linux-3.4.2.tar.bz2(2)打补丁patch -p1 < ../ linux-3.4.2_100ask.patch(3)复制config文件cp config_ok .config(4)配置make menuconfig(5)修改分区修改linux-3.4.2/arch/arm/mach-s3c24xx/common-smdk.c的smdk_default_nand_part函数,内核分区改为4M同时修改uboot中include/configs/smdk2440.h中MTDPARTS_DEFAULT 使内核分区为4M。(6)编译产生uImagemake uImage五、制作文件系统
1、解压
tar jxvf busybox-1.22.1.tar.bz2
2、配置
make menuconfig
Busybox Settings ->
general configuration ->
[*] don't use /usr //选中它 否则会破坏虚拟机
build options->
cross comliler prefix = arm-linux- //选择交叉编译工具
installtion options->
busybox installation prefix = /work/my_rootfs //指定安装路径
3、编译&安装
mkdir -p /work/my_rootfs //安装路径
make
make install
cd /work/my_rootfs
ls //查看是否安装成功
编译安装完毕之后,我们的文件系统就生成在 /work/my_roofs 目录下了
4、创建 /etc/inittab
mkdir -p /work/my_rootfs/etc
vi /work/my_rootfs/etc/inittab
# /etc/inittab
# 启动脚本/etc/init.d/rcS
::sysinit:/etc/init.d/rcS
# 启动 shell
::askfirst:-/bin/sh
# 重启关机前 卸载文件系统
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
5、创建 /etc/init.d/rcS
mkdir -p /work/my_rootfs/etc/init.d
vi /work/my_rootfs/etc/init.d/rcS
# 这是一个脚本文件,用/bin/sh解析
#!/bin/sh
# 挂载文件系统
mount -a
# 使用内存文件系统
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
# 设置IP
#/sbin/ifconfig eth0 192.168.1.17 #nfs不需要
# 挂载 /etc/fstab 中的文件系统
mount -a
exec /etc/rc.local
6、创建rc.local
vi /work/my_rootfs/etc/rc.local
#!/bin/sh
. /etc/profile //注意.后边有个空格!
7、创建/etc/fstab
vi /work/my_rootfs/etc/fstab
# device mount-point type options dump fsck order
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
8、构建 /dev 目录
mkdir -p /work/my_rootfs/dev
cd /work/my_rootfs/dev
sudo mknod console c 5 1
sudo mknod null c 1 3
9、创建其它目录
mkdir proc mnt tmp sys root usr
10、拷贝Lib
cd /opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi/lib
cp *.so* /work/my_rootfs/lib -d
cd /opt/FriendlyARM/toolschain/4.4.3/lib
cp *.so* /work/my_rootfs/lib -d六、移植 tslib
1、解压&配置&编译
(1)tar zxvftslib-1.4.tar.gz
(2)sudo mkdir -p/usr/local/tslib
(3)cd tslib
(4)./autogen.sh
(5)./configure--host=arm-linux ac_cv_func_malloc_0_nonnull=yes CC=arm-none-linux-gnueabi-gccCXX=arm-none-linux-gnueabi-g++ -prefix=/usr/local/tslib
(6)make
(7)make install
安装完成之后,tslib 就安装在虚拟机/usr/local/tslib 目录下
2、更改 tslib 配置文件
(1)cd/usr/local/tslib/etc/
(2)sudo vi ts.conf
去掉# module_raw input 前面的 “#” 和空格
3、将制作好的 tslib 移动到我们制作的文件系统
(1)cd /usr/local
(2)sudo tar zcvftslib.tar.gz tslib
(4)mkdir -p/work/my_rootfs/usr/local
(5)cp tslib.tar.gz/work/my_rootfs/usr/local
(6)tar zxvftslib.tar.gz
(7)rm tslib.tar.gz
4、添加 tslib 环境变量
(1)vi/work/my_rootfs/etc/profile #!/bin/sh
export T_ROOT=/usr/local/tslib
export LD_LIBRARY_PATH=/usr/local/tslib/lib:$LD_LIBRARY_PATH
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_TSDEVICE=/dev/input/event0
export TSLIB_PLUGINDIR=$T_ROOT/lib/ts
export TSLIB_CONFFILE=$T_ROOT/etc/ts.conf
export POINTERCAL_FILE=/etc/pointercal
export TSLIB_CALIBFILE=/etc/pointercal5、测试
此时,tslib 就已经移植好了,下载好的内核和文件系统到开发板,后启动。cd /usr/local/tslib/bin ./ts_test 来测试
出现“selected device is not a touchscreen Iunderstand”错误解决方法:cd /opt/FriendlyARM/toolschain/4.4.3/grep "EV_VERSION" * -nR 出现:arm-none-linux-gnueabi/sys-root/usr/include/linux/input.h:32:#defineEV_VERSION 0x010000改为:arm-none-linux-gnueabi/sys-root/usr/include/linux/input.h:32:#defineEV_VERSION 0x010001重新到tslib目录make cleanmakemake install更新开发板上的tslib。重新测试即可成功。七、移植 qt5.6
1、解压
tar zxvf qt-everywhere-opensource-src-5.6.0.tar
2、修改编译配置
cd /work/qt-everywhere-opensource-src-5.6.0/qtbase/mkspecs/linux-arm-gnueabi-g++
vi qmake.conf
针对于 2440 增加:
QT_QPA_DEFAULT_PLATFORM = linuxfb
QMAKE_CFLAGS += -msoft-float -D__GCC_FLOAT_NOT_NEEDED -march=armv4t-mtune=arm920t
QMAKE_CXXFLAGS += -msoft-float -D__GCC_FLOAT_NOT_NEEDED -march=armv4t-mtune=arm920t
march 指的 cpu 架构,针对2440 来说是 armv4t
mtune 指的 cpu 名字,针对 2440 来说是 arm920t
将以下部分
# 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
修改为:-lts 是指在链接时链接 tslib 库
# modifications to g++.conf
QMAKE_CC = arm-none-linux-gnueabi-gcc -lts
QMAKE_CXX = arm-none-linux-gnueabi-g++ -lts
QMAKE_LINK = arm-none-linux-gnueabi-g++ -lts
QMAKE_LINK_SHLIB = arm-none-linux-gnueabi-g++ -lts
# modifications to linux.conf
QMAKE_AR = arm-none-linux-gnueabi-ar cqs
QMAKE_OBJCOPY = arm-none-linux-gnueabi-objcopy
QMAKE_NM = arm-none-linux-gnueabi-nm -P
QMAKE_STRIP = arm-none-linux-gnueabi-strip
3、配置编译
(1)sudo mkdir -p /usr/local/Qt5.6
(2)cd ../../../回到QT目录
(3)配置 ./configure -prefix /usr/local/Qt5.6
-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
(4) make -j4(时间很长,曾使用4.3.2报错,使用4.4.3后解决)
(5)sudo make install(/usr/local/Qt5.6)
4、将移植好的 qt 打包到开发板
cd /usr/local
cp Qt5.6.tar.gz /work/nfs_root启动开发板挂载mnt目录Cp Qt5.6 /usr/local/
5、设置qt相关的环境变量
此部分可以参考qt官方问文档:http://doc.qt.io/qt-5/embedded-linux.html,这里仅仅是设置支持了触摸屏,可以参考官方设置支持键盘,鼠标等等。 在文件系统/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=480x272:mmSize=480x272:offset=0x0:tty=/dev/tty1 export QT_QPA_FB_TSLIB=1红 {MOD}部分请根据自己的开发板进行修改,JZ2440 V3 用上面的参数即可。八、测试Qt应用程序
将windows下编辑好的源码拷贝到虚拟机上,切换到源码目录 (1)/usr/local/Qt5.6/bin/qmake (2)make即可生成可执行文件,拿到开发板测试即可。 嫌费事的话,将qmake 添加到环境变量里。 在测试过程中发现程序跑起来没问题,但是有以下两条错误信息: QIconvCodec::convertFromUnicode:using Latin-1 for conversion, iconv_open failed
QIconvCodec::convertToUnicode: using Latin-1 for conversion, iconv_openfailed 大概是缺少libiconv,解决方法: (1)下载libiconv-1.14.tar.gz (2)mkdir -p /usr/local/libiconv (3)cd /usr/local/libiconv (4)./configure --host=arm-none-linux-gnueabi--prefix=/usr/local/libiconv CC=arm-none-linux-gnueabi-gccLDFLAGS="-L/opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi/sys-root/lib"--enable-static (5)make (6)make install (7)把虚拟机目录/usr/local/libiconv/lib 下的preloadable_libiconv.so 复制到文件系统的 /lib 下 (8)在 /etc/profile 中添加
export LD_PRELOAD=/lib/preloadable_libiconv.so九、使Qt支持中文
(1)下载字库jiang_dlut_DroidSansFallback.zip (2)解压将DroidSansFallback.ttf 放到单板文件系统/usr/local/Qt5.6/lib/fonts 目录下。 然后在使用qtcreator 开发qt应用程序时,在项目中添加 QT += gui 包含头文件 #include 代码中设置使用的字体。 intid = QFontDatabase::addApplicationFont("/usr/local/Qt5.6/lib/fonts/DroidSansFallback.ttf"); QStringmsyh = QFontDatabase::applicationFontFamilies (id).at(0); QFontfont(msyh,10); font.setPointSize(20); this->setFont(font);十、实验操作
开发板上电:nfs 30000000192.168.1.102:/work/nfs_root/root_ts.jffs2nand erase.part rootfs
nand write.jffs2 30000000 460000 $filesizenfs 32000000 192.168.1.102:/work/nfs_root/uImage_nolcd_4.4.3nand write 32000000 kernelset bootargs console=ttySAC0,115200root=/dev/mtdblock3 rootfstype=jffs2 savereset
cd /etc/init.d/
vi rcS
加入:ifconfig eth0 192.168.1.17
mount -t nfs -o nolock 192.168.1.102:/work/nfs_root /mnt
cd /usr/local/lstslib更改 tslib 配置文件
(1)cd /usr/local/tslib/etc/
(2)sudo vi ts.conf
去掉# module_raw input 前面的 “#” 和空格
insmod s3c_ts.ko
cd /usr/local/tslib/bin
./ts_将单板 /mnt下的QT5.6复制到/usr/local目录下cp -rf Qt5.6 /usr/local/查看tslib和QT的环境变量:vi etc/profile(tslib和QT的环境变量)cd /mntcp preloadable_libiconv.so ../lib/(增加etc/profile环境变量)cp DroidSansFallback.ttf /usr/local/Qt5.6/lib/fonts/(增加etc/profile环境变量)export LD_PRELOAD=/lib/preloadable_libiconv.soinsmod cfbimgblt.koinsmod cfbcopyarea.koinsmod cfbfillrect.koinsmod lcd.ko./fb_test /dev/fb0
insmod s3c_ts.kocd /usr/local/tslib/bin./ts_calibrate./arm_43
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮