移植qt5.6.0到armv7

移植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

环境搭建

  1. 在win7主机中安装vmware12 #基本上vm10以上就可以
  2. 在vm12中虚拟出ubuntu14.04 x64 #我用的ubuntu镜像是ubuntu14.04 64位的。这个过程自行百度
    注意:内存最好1G以上,cpu最好分配4核,也不是越高越好,但是太低影响编译速度
  3. 安装好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 的说明。我只说需要注意的地方

  1. 一定要看configure -help的配置说明,因为这些配置决定了你编译出来的qt库需要具备那些功能,例如使用支持zlib、sqlit、3d等等
  2. 在写这个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

得到有用信息,

  1. elf是32位的arm,可以被板子执行。
  2. 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章