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

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