Qt for ARM_Linux环境搭建-Qt5.7+iTop4412嵌入式平台移植

2016年10月31日 11:42:50

阅读数:5207

经过为期3天的编译、移植,终于将Qt5.7成功移植到iTop4412开发板,板载exynos4412处理器,基于ARM Cortex-A9内核。因此,本篇教程以iTop4412示例,适用于Qt5.7在ARM_Linux平台上的移植。

--------------------------------------------------------------------------------------------------------------------------------

提示:

针对移植中可能出现的问题,已整理好列在附录部分,需要查看的请直接跳到最后部分。

----------------------------------------------------------------------------------------------------------

移植准备

目标机硬件平台:支持MMU的ARM嵌入式设备

(ARM7及以下芯片不支持MMU,不可运行Linux系统,只能运行RTOS,如uC linux,freeRTOS,本教程以linux最小系统示例)

目标机软件平台:arm_Linux最小系统(busybox+Linux3.0.15内核+rootfs根文件系统)

开发机硬件平台:x86/x64 PC机

开发机软件平台:Windows 7操作系统+QtCreator4_win版

、安装Ubuntu12.0.4操作系统的虚拟机+QtCreator4_linux版

示例移植应用:serial_Linux工程

(注:serial_Linux是针对桌面Linux系统移植好的PC端程序(x86/x64平台),无需交叉编译。将应用移植到ARM平台时,需要交叉编译。)

移植步骤

1.准备相关开发包

以下采用的系统为ubuntu12.04,开发板为迅为iTOP4412,4.3寸屏。

qt5.7源码qt-everywhere-opensource-src-5.7.0.tar.xz

http://www.download3k.com/Install-Qt.html

ARM交叉编译工具

arm-2014.05-29-arm-none-Linux-gnueabi-i686-pc-linux-gnu.tar.bz2

http://www.veryarm.com/arm-none-linux-gnueabi-gcc

2.安装arm交叉编译器arm-2014

将“arm-2014.05-29-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2”解压到Ubuntu 系统的文件夹“/usr/local/arm”中。

然后修改环境变量,切换到home目录,然后输入命令“vim .bashrc”,打开设置环境变量的文件“.bashrc”,将环境变量修改为“export PATH=$PATH:/usr/local/arm/arm-2014.05/bin”

保存退出,然后更新一下环境变量,输入命令

source .bashrc

接着测试一下,编译器路径设置的对不对。在Ubuntu 命令行中输入命令”arm”,

然后按键盘”Tab”,出现编译器“arm-none-linux-gnueabi-gcc-4.8.2”,这就说明编译

器路径设置正确。

3.交叉编译tslib1.4

对触摸屏信号的获取、校正、滤波处理,均采用开源的tslib,本文采用的tslib版本为最新的tslib1.4

1).将tslib1.4拷贝到/home/lz/transplant目录下(可以根据自己的系统选择某一目录),然后执行解压缩命令

tar -vxf tslib-1.4.tar.gz

2)切换到tslib目录:

cd tslib

安装交叉编译tslib必须的一些工具(可以先查看是否已安装)

sudo apt-get install autoconfsudo apt-get install automakesudo apt-get install libtool

3).利用脚本写编译过程

在tslib文件夹下新建文件configTslib14.sh

vi configTslib14.sh

内容如下:

#!/bin/sh

make clean && make distcleanecho "ac_cv_func_malloc_0_nonnull=yes" >arm-linux.cache

CC=/usr/local/arm/arm-2014.05/bin/arm-none-linux-gnueabi-gcc ./configure --host=arm-linux --prefix=/opt/tslib1.4 --cache-file=arm-linux.cache

make && make install

然后运行configTslib14.sh

./configTslib14.sh

执行结束后,我们查看一下是否安装成功,执行命令:

ls /opt/tslib1.4

如果出现bin,etc,include,lib这4个目录,如下图所示,说明交叉编译并安装tslib成功。

2db7a2eaeeb1174c00e906dac77de348.png

4.交叉编译QT5.7.0

1)将qt-everywhere-opensource-src-5.7.0.tar.gz执行如下命令解压:

tar -vxf qt-everywhere-opensource-src-5.7.0.tar.gz

cd qt-everywhere-opensource-src-5.7.0

2)修改交叉编译架构用到的信息:

gedit 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

QT_QPA_DEFAULT_PLATFORM = linux #eglfs

QMAKE_CFLAGS_RELEASE += -O2 -march=armv7-a

QMAKE_CXXFLAGS_RELEASE += -O2 -march=armv7-a

include(../common/linux.conf)include(../common/gcc-base-unix.conf)include(../common/g++-unix.conf)

# modifications to g++.conf

QMAKE_CC                = arm-none-linux-gnueabi-gcc

QMAKE_CXX               = arm-none-linux-gnueabi-g++

QMAKE_LINK              = arm-none-linux-gnueabi-g++

QMAKE_LINK_SHLIB        = arm-none-linux-gnueabi-g++

# 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-stripload(qt_config)

3)创建一个脚本文件,用于生成Makefile,执行命令

gedit autoConfigure.sh

输入下面内容并保存:

#!/bin/sh

./configure \

-v \-prefix /opt/qt-5.7.0 \-release \-opensource \-no-accessibility-make libs \-xplatform linux-arm-gnueabi-g++ \-optimized-qmake \-pch \-qt-sql-sqlite \-qt-zlib \-tslib \-no-opengl \-no-sse2 \-no-openssl \-no-nis \-no-cups \-no-glib \-no-pkg-config \-no-separate-debug-info \-I/opt/tslib1.4/include -L/opt/tslib1.4/lib

其中-prefix /opt/qt-5.7.0代表我们编译完后要安装地址;-tslib代表QT对触摸板的支持,-I 和 -L后面分别为为第一步编译tslib的include和lib的安装目录。

4)执行命令:

chmod 777 qt.configure.sh

./autoConfigure.sh

5)上述命令自动生成Makefile文件。

执行命令启动编译:

make

6)编译大概2个小时。

编译结束后,执行安装命令:

sudo make install

7)我们切换到目标目录下看看是否安装成功:

cd /opt/qt-5.7.0

ls -hl

8)将/opt/qt-5.7.0和/opt/tslib1.4 拷贝到ARM平台对应的文件系统中对应的目录中。

请保证ARM平台已成功移植Linux系统,原则上编译Linux内核的编译器应和编译Qt库的编译器版本一致,否则会出现应用无法运行,缺少必要依赖库的问题,请参看附录《移植常见问题与解决方法》。

5.配置QtCreator交叉编译环境

应用程序需要在ARM平台上运行,也需要交叉编译成对应平台的可执行文件。在QtCreator下直接配置交叉编译环境,一键编译是比较简单易行的方法。

1)在菜单中选择Tools——Options,在弹出的对话框中,选择Build & Run,选择标签Compilers,按下图设置,选择C++交叉编译器,如下图所示:

2566e2bca044c4ad7cafe48692ef27a7.png

2)切换到Qt Versions标签,点击“Add”按钮,选择qmake,如图所示:

72a2c34e8125735e8145e67110f43b77.png

3)选择完成,按“OK”按钮,设置如图所示:

切换到Kits标签,点击“Add”按钮,然后设置如下图所示:

7cd64804c1fbe6a5906c6f35a31b2d28.png

6.交叉编译待移植的应用程序

基于本SDK开发的应用软件几乎无需修改代码,配置好运行环境后,直接交叉编译通过即可在相应平台上运行,因此只需在开发环境中一键交叉编译后,按以下步骤配置运行环境即可:

1)把字库Ubuntu_L.ttf 等字库拷贝到

/opt/qt-5.7.0/lib/fonts

在开发板串口命令窗口中输入:

vi /etc/profile

如下图所示

将其修改为以下内容

export TSLIB_ROOT=/opt/tslib1.4

export QT_ROOT=/opt/qt-5.7.0

export TSLIB_TSDEVICE=/dev/input/event2

export TSLIB_TSEVENTTYPE=input

export TSLIB_CONFFILE=/opt/tslib1.4/etc/ts.conf

export TSLIB_PLUGINDIR=/opt/tslib1.4/lib/ts

export TSLIB_CONSOLEDEVICE=none

export TSLIB_FBDEVICE=/dev/fb0

export QWS_MOUSE_PROTO=tslib:/dev/input/event2

export LD_LIBRARY_PATH=/lib:/usr/lib:/usr/local/lib:$QT_ROOT/lib:$TSLIB_ROOT/lib:$TSLIB_ROOT/lib/

export QT_QPA_PLATFORM_PLUGIN_PATH=$QT_ROOT/plugins

export QT_QPA_PLATFORM=linuxfb:tty=/dev/fb0

export QT_QPA_FONTDIR=$QT_ROOT/lib/fonts

export QT_QPA_GENERIC_PLUGINS=tslib

保存退出,执行命令(一定要执行,否则可能报错):

source /etc/profile

2)然后在串口命令窗中输入 vi /opt/tslib1.4/etc/ts.conf 来配置触摸屏

把第二行的注释去掉,把ts设置成输入模式(注意把前面的空格也去掉)

69cc311ef730adb14bbf93d884eed769.png

3)将交叉编译好的应用软件拷贝到ARM平台上测试。

------------------------------------------------------------------------------------------------------------------------------------------------------------

附录

常见移植问题汇总

1.Ubuntu64位系统在执行arm交叉编译器可能会出现如下看似莫名的问题:

21c5ba6192edc30611928390c5b06286.png

环境变量配置正确,目录下也能找到相关编译器,执行编译时却仍报找不到编译器或目录的错误。

原因分析:这是由于编译器是32位的,在如Ubuntu64这样的64位linux系统下运行会缺少32位系统的运行库。

解决:64位linux系统上安装32位运行库,执行如下命令:

sudo apt-get install ia-32 libs

0a35022e22c756d8d726421faeb56cc1.png

2.Win下直接拷贝过去的脚本执行错误

原因分析:

Linux系统的换行符为\n,而win下为\n\r,故直接拷贝到linux下执行会报错。

解决:执行命令将脚本中所有以\r结束的字符替换为空白:

sed -i ‘s/\r$//’ autoConfig.sh

499a753a5f2ec17181b6fb5e542f5238.png

3.Project ERROR:Unknown module(s) in QT: quick-private

在编译过程中出现错误:

Project ERROR:Unknown module(s) in QT: quick-private

make[2]: *[sub-quickwidgets-make_first-ordered] 错误 3

make[2]:正在离开目录

/home/jason/work/qt-everywhere-opensource-src-5.3.0/qtdeclarative/src'

make[1]: ***[sub-src-make_first] 错误 2

make[1]:正在离开目录

/home/jason/work/qt-everywhere-opensource-src-5.3.0/qtdeclarative’

make: *[module-qtdeclarative-make_first] 错误 2

原因分析:在qt5.7中,quickwidgets模块依赖quick模块,quick模块有依赖openGL,检查配置参数,发现在./configure添加了参数-no -opengl,

解决:在./configure去掉参数-no -opengl

提示:类似的问题多半是因为依赖问题,所以在初次编译时,格外需要注意./configure中的配置参数选取。

4.在编译的时候提示:

cannot find –lxxxx

原因分析:找不到libxxxx.so

解决:把libxxxx.so拷贝到交叉编译工具链的库目录就可以

例如:如果编译触摸屏出现找不到-lts,可以在tslib/lib目录下执行:

sudo cp libts-0.0.so.0.1.1

/usr/local/arm/arm-2014.05/arm-none-Linux-gnueabi/libc/thumb2/lib/libts.so

其中/usr/local/arm/arm-2014.05/是我的交叉编译工具链的安装目录。

5.在开发板运行过程中,假如运行有提示:

Illegal instruction (非法指令)

原因分析:这里很可能是因为对芯片的指令集没有选择好

解决:

在 /qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf文件加入对应的参数,例如

QMAKE_CFLAGS_RELEASE += -O2 -march=armv7-a

QMAKE_CXXFLAGS_RELEASE += -O2 -march=armv7-a

6.运行时报错:

‘GLIBC_2.9’not found:/lib/lib.so.6

原因分析:linux系统和Qt库不匹配导致,确切地说应该是交叉编译链的版本不匹配导致。原则上应该用编译Qt库的编译器交叉编译Linux内核,制作相应的Linux最小系统。现提供一种间接解决方案。

解决:将编译Qt库的arm交叉编译器下的对应lib文件夹拷贝到Linux系统根目录下的lib,完全覆盖,arm编译器下的lib是已经交叉编译好的,可以直接拷贝解决linux系统的运行库问题。

7.运行时报错找不到libstdc++.so.6

原因分析:同理,找不到c++运行库的问题。

解决:将arm编译器下的lib找到拷贝到linux根文件系统的lib下。

8.运行时报错

b27ce8b3057e832462bdf904bd28752f.png

原因分析:未更新ARM—Linux的环境变量或环境变量配置有误。

解决:

1.检查/etc/profile下的配置(参照移植步骤里的配置)

2.更新环境变量,执行:

source /etc/profile

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐