移植qt5.6.0到armv7 <完整过程>

来源:互联网 发布:linux samba rpm 编辑:程序博客网 时间:2024/06/04 20:09

移植qt5.6.0到armv7 <完整过程>

概述:本log记录移植qt的整个过程,包括从安装虚拟机到最后编译成功,因为其中任何一个细节都可能导致移植失败


目录

  • 移植qt560到armv7 完整过程
  • 目录
  • 环境
    • 环境介绍
    • 环境搭建
    • 下载软件
  • 安装
    • 安装交叉编译工具
    • 安装tslib14targz
    • 安装qt-everywhere-opensource-src-560-alphatargz
    • 安装arm-linux-gdb
      • 解压
      • 编译arm-linux-gdb
      • 编译arm-linux-gdbserver
      • 测试arm-linux-gdbserver

环境

环境介绍

  • 操作系统: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-gnueabi2、tslib1.4.tar.gz3、qt-everywhere-opensource-src-5.6.0-alpha.tar.gz

安装

安装交叉编译工具

如果自己有特殊编译链的需求,或者觉得自己是高手,那就随意从网上手动下载安装吧,这里采用debian提供的自动安装,不用考虑依赖关系和环境变量sudo apt-get install g++-arm-linux-gnueabisudo 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      = UNIXCONFIG                 += incrementalQMAKE_INCREMENTAL_STYLE = sublib#一下内容具体含义请查看官方文档,我的板子是beaglebone black,所以arch=armv7-a mtune=cortex-a8 QT_QPA_DEFAULT_PLATFORM = linuxfbQMAKE_CFLAGS  += -msoft-float -D__GCC_FLOAT_NOT_NEEDED -march=armv7-a -mtune=cortex-a8QMAKE_CXXFLAGS += -msoft-float -D__GCC_FLOAT_NOT_NEEDED -march=armv7-a -mtune=cortex-a8include(../common/linux.conf)include(../common/gcc-base-unix.conf)include(../common/g++-unix.conf)#交叉编译工具链,自行修改成自己的,在命令行中输入#arm- 加tab键,打印出来的就是自己的工具链名字。后缀的-lts意思是加上ts库,也就是tslib库# modifications to g++.confQMAKE_CC                = arm-linux-gnueabi-gcc -ltsQMAKE_CXX               = arm-linux-gnueabi-g++ -ltsQMAKE_LINK              = arm-linux-gnueabi-g++ -ltsQMAKE_LINK_SHLIB        = arm-linux-gnueabi-g++ -lts#同上# modifications to linux.confQMAKE_AR                = arm-linux-gnueabi-ar cqsQMAKE_OBJCOPY           = arm-linux-gnueabi-objcopyQMAKE_NM                = arm-linux-gnueabi-nm -PQMAKE_STRIP             = arm-linux-gnueabi-stripload(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

原创粉丝点击