移植所需的工具linux
sudo apt-get install autoconf sudo apt-get install automake sudo apt-get install libtool
将“arm-2014.05-29-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2”解压到Ubuntu 系统的文件夹“/usr/local/arm”中。
而后修改环境变量,c++
输入命令“~vim .bashrc” (根据本身bash的不一样)git
在环境变量中加入arm-gcc解压的路径:“export PATH=$PATH:/usr/local/arm/arm-2014.05/bin”
保存退出,输入命令“source .bashrc”,更新一下环境变量(或者从新登录或者重启系统均可以)github
source .bashrc
测试sql
在Ubuntu 命令行中输入命令”arm”, 按键盘”Tab”补全,出现编译器“arm-none-linux-”的列表,说明编译器路径设置正确。vim
对触摸屏信号的获取、校订、滤波处理,均采用开源的tslib,本文采用的tslib版本为经典的tslib1.4。ruby
1.将下载好的tslib1.4拷贝到任意目录下(能够根据本身的系统选择某一目录),而后执行解压缩命令bash
tar -vxf tslib-1.4.tar.gz
切换到tslib目录:markdown
cd tslib
2.利用脚本写编译过程
在tslib文件夹下新建configTslib14.sh架构
vi configTslib14.sh
内容以下:(粗体部分根据本身的需求修改)
运行configTslib14.sh
./configTslib14.sh
若是出现bin,etc,include,lib这4个目录,说明交叉编译并安装tslib成功。 (这个时候还没移植tslib到arm板中)
解压qt-everywhere-opensource-src:
tar -vxf qt-everywhere-opensource-src-5.9.1.tar.gz cd qt-everywhere-opensource-src-5.9.1
修改交叉编译架构用到的信息:
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-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-strip
load(qt_config)#因为我打算移植到A20开发板中,cpu架构是下面这样的,所以这里要根据实际状况修改
COMPILER_FLAGS = -march=armv7-a -mtune=cortex-a7 -mfpu=neon -mthumb
建立一个脚本文件,用于生成Makefile,执行命令
vim autoConfigure.sh
输入下面内容并保存:
#!/bin/sh
sudo echo "可能须要执行权限"
output=/opt/arm/qt-5.9.1
tslib=/opt/arm/tslib1.4
./configure \
-v \
-prefix $output \
-release \
-opensource \
-confirm-license \
-no-accessibility \
-make libs \
-xplatform linux-arm-gnueabi-g++ \
-linuxfb \
-optimized-qmake \
-pch \
-qt-libjpeg \
-qt-libpng \
-sql-sqlite \
-qt-zlib \
-tslib \
-no-opengl \
-no-sse2 \
-no-openssl \
-no-cups \
-no-glib \
-no-pkg-config \
-recheck-all \
-no-separate-debug-info \
-I$tslib/include -L$tslib/lib
if [ $? -eq 0 ]; then
sudo make -j4 && sudo make install && ls $output
else
echo "配置失败"
fi
上面的主要参数含义说明以下:
-embedded arm: 表示将编译针对 arm 平台的 embedded 版本;
-xplatform qws/linux-arm-g++: 表示使用 arm-linux 交叉编译器进行编译;
-qt-mouse-tslib: 表示将使用 tslib 来驱动触摸屏;
其中
-prefix /opt/qt-5.7.0表明咱们编译完QT5.4.1后要安装地址;-tslib表明QT对触摸板的支持,
-I 和 -L后面分别为为第一步编译tslib的include和lib的安装目录。
执行命令:
chmod +x qt.configure.sh ./autoConfigure.sh
上述命令自动生成Makefile文件。
执行命令启动编译执行安装命令
编译大概2个小时。
将/opt/arm/qt-5.7.0和/opt/arm/tslib1.4 拷贝到开发板的文件系统中对应的目录中。
安装qtcreator
进入qtcreator开发环境
在菜单中选择Tools——Options,在弹出的对话框中,选择Build & Run,选择标签Compilers,按下图设置,选择C++交叉编译器,以下图所示:
切换到Qt Versions标签,点击“Add”按钮,选择qmake,如图所示:
选择完成,按“OK”按钮,设置如图所示:
切换到Kits标签,点击“Add”按钮,而后设置以下图所示:
把字库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
而后在串口命令窗中输入 vi /opt/tslib1.4/etc/ts.conf 来配置触摸屏
把第二行的注释去掉,把ts设置成输入模式(注意把前面的空格也去掉)
下面编写测试程序来测试开发板上
打开qtcreator,新建项目,拖几个按钮上去,以下图所示
编译获得可执行程序untitled,查看一下,能够看到其信息显示为arm平台,以下图所示
将untitled拷贝到开发板中文件系统的/bin目录,运行该程序。
[root@iTOP-4412]# /bin/untitled
看一下板子:
附录
常见移植问题汇总
1.Ubuntu64位系统在执行arm交叉编译器可能会出现以下看似莫名的问题:
环境变量配置正确,目录下也能找到相关编译器,执行编译时却仍报找不到编译器或目录的错误。
缘由分析:这是因为编译器是32位的,在如Ubuntu64这样的64位linux系统下运行会缺乏32位系统的运行库。
解决:64位linux系统上安装32位运行库,执行以下命令:
sudo apt-get install ia-32 libs
2.Win下直接拷贝过去的脚本执行错误
缘由分析:
Linux系统的换行符为\n,而win下为\n\r,故直接拷贝到linux下执行会报错。
解决:执行命令将脚本中全部以\r结束的字符替换为空白:
sed -i ‘s/\r$//’ autoConfig.sh
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.运行时报错
缘由分析:未更新ARM—Linux的环境变量或环境变量配置有误。
解决:
1.检查/etc/profile下的配置(参照移植步骤里的配置)
2.更新环境变量,执行:
source /etc/profile