移植qt5.6.0到armv7 <完整过程>
概述:本log记录移植qt的整个过程,包括从安装虚拟机到最后编译成功,因为其中任何一个细节都可能导致移植失败
目录
环境
环境介绍
- 操作系统:win7(64)
- 虚拟机:vmware12
- 虚拟系统:Linux ubuntu 3.19.0-25-generic
- #26~14.04.1-Ubuntu SMP Fri Jul 24 21:16:20 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
环境搭建
- 在win7主机中安装vmware12 #基本上vm10以上就可以
- 在vm12中虚拟出ubuntu14.04 x64 #我用的ubuntu镜像是ubuntu14.04 64位的。这个过程自行百度
注意:内存最好1G以上,cpu最好分配4核,也不是越高越好,但是太低影响编译速度 - 安装好ubuntu后,修改/etc/apt/source.list 源(源内容自行百度),apt-get update;apt-get upgrade
注意:为什么要加这条内容?因为以后可能要用到一些软件,依赖关系和版本都会受到更新的影响
下载软件:
下载以下软件包
1、交叉编译工具连
sudo apt-get install g++-arm-linux-gnueabi
sudo apt-get install gcc-arm-linux-gnueabi
2、tslib1.4.tar.gz
3、qt-everywhere-opensource-src-5.6.0-alpha.tar.gz
安装
安装交叉编译工具
如果自己有特殊编译链的需求,或者觉得自己是高手,那就随意从网上手动下载安装吧,这里采用debian提供的自动安装,不用考虑依赖关系和环境变量
sudo apt-get install g++-arm-linux-gnueabi
sudo apt-get install gcc-arm-linux-gnueabi
快准狠
安装tslib1.4.tar.gz
# sudo apt-get install automake;autoconf;libtool
# ./autogen.sh
# echo "ac_cv_func_malloc_0_nonnull=yes" >arm-linux.cache
# ./configure --host=arm-linux-gnueabi --cache-file=arm-none-linux-gnueabi.cache --enable-inputapi=no --prefix=/opt/tslib1.4
# make
# make install
注意:
第三条 echo命令会生成cache文件,不可缺少,因为没有这个文件的内容,编译出错:找不到 rc_malloc函数等错误。
第四条命令中的–prefix= 指定生成库的位置,这个位置自己记住,因为要在安装qt-everywhere-opensource-src-5.6.0-alpha.tar.gz时用到
安装qt-everywhere-opensource-src-5.6.0-alpha.tar.gz
首先,vim qt-everywhere-opensource-src-5.6.0/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
#一下内容具体含义请查看官方文档,我的板子是beaglebone black,所以arch=armv7-a mtune=cortex-a8
QT_QPA_DEFAULT_PLATFORM = linuxfb
QMAKE_CFLAGS += -msoft-float -D__GCC_FLOAT_NOT_NEEDED -march=armv7-a -mtune=cortex-a8
QMAKE_CXXFLAGS += -msoft-float -D__GCC_FLOAT_NOT_NEEDED -march=armv7-a -mtune=cortex-a8
include(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)
#交叉编译工具链,自行修改成自己的,在命令行中输入#arm- 加tab键,打印出来的就是自己的工具链名字。后缀的-lts意思是加上ts库,也就是tslib库
# modifications to g++.conf
QMAKE_CC = arm-linux-gnueabi-gcc -lts
QMAKE_CXX = arm-linux-gnueabi-g++ -lts
QMAKE_LINK = arm-linux-gnueabi-g++ -lts
QMAKE_LINK_SHLIB = arm-linux-gnueabi-g++ -lts
#同上
# 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)
#这个位置就是编译tslib时的prefix位置,自己设置
QMAKE_INCDIR=/opt/tslib1.4/include/
QMAKE_LIBDIR=/opt/tslib1.4/lib/
然后1,vim autoconfig.sh
#!/bin/sh
./configure \
-verbose \
-prefix /opt/qt-5.6.0 \
-confirm-license \
-opensource -release \
-make libs \
-xplatform linux-arm-gnueabi-g++ \
-optimized-qmake \
-linuxfb \
-pch \
-qt-sql-sqlite \
-qt-libjpeg \
-qt-libpng \
-qt-zlib \
-tslib \
-no-opengl \
-no-sse2 \
-no-openssl \
-no-nis \
-no-cups \
-no-glib \
-no-dbus \
-no-xcb \
-no-xcursor -no-xfixes -no-xrandr -no-xrender \
-no-separate-debug-info \
-make examples -nomake tools -nomake tests -no-iconv \
-I/opt/tslib1.4/include \
-L/opt/tslib1.4/lib
这个文件的编写参考configure -help 的说明。我只说需要注意的地方
- 一定要看configure -help的配置说明,因为这些配置决定了你编译出来的qt库需要具备那些功能,例如使用支持zlib、sqlit、3d等等
- 在写这个autoconfig.sh时,不要直接复制粘贴我的,请自行手打。(空格和tab啊,消耗了半天时间,血的教训)
然后2,# ./autoconfig.sh
然后3,# make
然后4,# 上个厕所,喝杯水,或者喝杯水,上个厕所
最后,# make insatll
拷贝到开发板:
安装arm-linux-gdb
如果需要在开发版上在线调试的,需要安装开发板的arm-linux-gdbserver;如果只是开发一些简单的图形界面,个人觉得可以直接使用ubuntu的qtcreater,开发好后,拷贝到开发板即可,但是如果开发的qt需要在线调试开发版的硬件资源,则需要安装arm-gdb.
下载:http://ftp.gnu.org/gnu/gdb/
这里需要说明:gdb和gcc不是同一个项目,(记得g++和gcc也不是同一个项目)所以就有兼容问题例如:memcpy(p_str1, p_str2, sizeof(struct abc))函数在早期版本的gcc中,对语法检测不是很严格,sizeof返回值自动转为int,但是在新版本gcc中会报错,类型不匹配。我试过三个版本的gdb,结合我的gcc报错最少的是gdb-7.11.tar.gz
arm-linux-gdb和arm-linux-gdbserver需要分开编译,gdb是给qtcreate用的,是x86的;arm-linux-gdbserver是给板子用的,是arm的;所以gcc是不一样的。
解压
# tar xvf gdb-7.11.tar.gz -C ~/software
编译arm-linux-gdb
#./configure --target=arm-linux --prefix=/usr/local/arm-linux-gdb
#make
#make install
这里会编译错误,在make到example目录的时候显示找不到图形库,不过没有关系,主要东东已经ok,如果没有强迫证的话,可以掠过。
编译arm-linux-gdbserver
# cd ~/software/gdb-7.11/gdb/gdbserver
# ./configure --target=arm-linux --host=arm-linux
# make CC=arm-linux-gnueabi-gcc
# make install
这里可能会出现编译错误,很简单,结合自己的c语言基础+度娘,可以轻松搞定。
测试arm-linux-gdbserver
这个坑我不踩
当你非常兴奋的走到这里,终于可以看看gdbserver在板子中输出几行版本信息的时候,你可能得不到幸运之神的眷顾,居然报错了,怎么办?兵来将挡,水来土掩!
首先,在arm中使用file命令查看gdbserver格式,你会惊奇的看到:
root@beaglebone:/usr/local# file arm-linux-gdbserver
arm-linux-gdbserver: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3, for GNU/Linux 2.6.32, BuildID[sha1]=7434d5d3bd2875dfc0f41d421e8a36d7eca2679a, not stripped
得到有用信息,
- elf是32位的arm,可以被板子执行。
- dynamically linked 需要/lib/ld-linux.so.3
那么就好办了,看看/lib目录有没有这个so,发现没有。看过【程序员的自我修养】或熟悉编译原理的同学都知道ld是干嘛的,那么我直接将arm的ld创建一个同名软连接就ok了。
# ln -s /lib/arm-linux-gnueabihf/ld-2.19.so /lib/ld-linux.so.3
到此,大功告成!
收兵。
————————————————–
参考资料:
http://www.cnblogs.com/chenfulin5/p/5798764.html
http://www.cnblogs.com/cherishui/p/4414013.html