Qt for ARM_Linux環境搭建-Qt5.7嵌入式平臺移植 Ubuntu 16.04

Qt for ARM_Linux環境搭建-Qt5.7+iTop4412嵌入式平臺移植html

2016年10月31日 11:42:50linux

閱讀數:5207c++

通過爲期3天的編譯、移植,終於將Qt5.7成功移植到iTop4412開發板,板載exynos4412處理器,基於ARM Cortex-A9內核。所以,本篇教程以iTop4412示例,適用於Qt5.7在ARM_Linux平臺上的移植。sql

--------------------------------------------------------------------------------------------------------------------------------ubuntu

 

提示:vim

針對移植中可能出現的問題,已整理好列在附錄部分,須要查看的請直接跳到最後部分。bash

----------------------------------------------------------------------------------------------------------架構

 

移植準備

 

目標機硬件平臺:支持MMU的ARM嵌入式設備工具

(ARM7及如下芯片不支持MMU,不可運行Linux系統,只能運行RTOS,如uC linux,freeRTOS,本教程以linux最小系統示例)測試

目標機軟件平臺:arm_Linux最小系統(busybox+Linux3.0.15內核+rootfs根文件系統)

開發機硬件平臺:x86/x64 PC機

開發機軟件平臺:Windows 7操做系統+QtCreator4_win版

、安裝Ubuntu12.0.4操做系統的虛擬機+QtCreator4_linux版

示例移植應用:serial_Linux工程

(注:serial_Linux是針對桌面Linux系統移植好的PC端程序(x86/x64平臺),無需交叉編譯。將應用移植到ARM平臺時,須要交叉編譯。)

 

移植步驟

1.準備相關開發包

如下采用的系統爲ubuntu12.04,開發板爲迅爲iTOP4412,4.3寸屏。 
qt5.7源碼qt-everywhere-opensource-src-5.7.0.tar.xz 
http://www.download3k.com/Install-Qt.html

ARM交叉編譯工具

arm-2014.05-29-arm-none-Linux-gnueabi-i686-pc-linux-gnu.tar.bz2 
http://www.veryarm.com/arm-none-linux-gnueabi-gcc

tslib1.4 
http://vdisk.weibo.com/s/AcUHxOERV2k0?sudaref=www.baidu.com

 

 

2.安裝arm交叉編譯器arm-2014

將「arm-2014.05-29-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2」解壓到Ubuntu 系統的文件夾「/usr/local/arm」中。 
而後修改環境變量,切換到home目錄,而後輸入命令「vim .bashrc」,打開設置環境變量的文件「.bashrc」,將環境變量修改成「export PATH=$PATH:/usr/local/arm/arm-2014.05/bin」 
保存退出,而後更新一下環境變量,輸入命令

 

source .bashrc

 

接着測試一下,編譯器路徑設置的對不對。在Ubuntu 命令行中輸入命令」arm」, 
而後按鍵盤」Tab」,出現編譯器「arm-none-linux-gnueabi-gcc-4.8.2」,這就說明編譯 
器路徑設置正確。

 

3.交叉編譯tslib1.4

對觸摸屏信號的獲取、校訂、濾波處理,均採用開源的tslib,本文采用的tslib版本爲最新的tslib1.4 
1).將tslib1.4拷貝到/home/lz/transplant目錄下(能夠根據本身的系統選擇某一目錄),而後執行解壓縮命令

tar -vxf tslib-1.4.tar.gz

 

2)切換到tslib目錄:

cd tslib

安裝交叉編譯tslib必須的一些工具(能夠先查看是否已安裝)

sudo apt-get install autoconfsudo apt-get install automakesudo apt-get install libtool

 

3).利用腳本寫編譯過程 
在tslib文件夾下新建文件configTslib14.sh

 

vi configTslib14.sh

 

內容以下:

#!/bin/sh

make clean && make distcleanecho "ac_cv_func_malloc_0_nonnull=yes" >arm-linux.cache

CC=/usr/local/arm/arm-2014.05/bin/arm-none-linux-gnueabi-gcc ./configure --host=arm-linux --prefix=/opt/tslib1.4 --cache-file=arm-linux.cache

make && make install

 

而後運行configTslib14.sh

./configTslib14.sh

 

執行結束後,咱們查看一下是否安裝成功,執行命令:

ls /opt/tslib1.4

 

若是出現bin,etc,include,lib這4個目錄,以下圖所示,說明交叉編譯並安裝tslib成功。 

 

 

4.交叉編譯QT5.7.0

 

1)將qt-everywhere-opensource-src-5.7.0.tar.gz執行以下命令解壓:

tar -vxf qt-everywhere-opensource-src-5.7.0.tar.gz

 

cd qt-everywhere-opensource-src-5.7.0

 

2)修改交叉編譯架構用到的信息:

gedit 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

 

QT_QPA_DEFAULT_PLATFORM = linux #eglfs

QMAKE_CFLAGS_RELEASE += -O2 -march=armv7-a

QMAKE_CXXFLAGS_RELEASE += -O2 -march=armv7-a

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-stripload(qt_config)

 

3)建立一個腳本文件,用於生成Makefile,執行命令

gedit autoConfigure.sh

輸入下面內容並保存:

#!/bin/sh

./configure \

-v \-prefix /opt/qt-5.7.0 \-release \-opensource \-no-accessibility-make libs \-xplatform linux-arm-gnueabi-g++ \-optimized-qmake \-pch \-qt-sql-sqlite \-qt-zlib \-tslib \-no-opengl \-no-sse2 \-no-openssl \-no-nis \-no-cups \-no-glib \-no-pkg-config \-no-separate-debug-info \-I/opt/tslib1.4/include -L/opt/tslib1.4/lib

 

其中-prefix /opt/qt-5.7.0表明咱們編譯完後要安裝地址;-tslib表明QT對觸摸板的支持,-I 和 -L後面分別爲爲第一步編譯tslib的include和lib的安裝目錄。 


4)執行命令:

chmod 777 qt.configure.sh

./autoConfigure.sh

 

5)上述命令自動生成Makefile文件。 
執行命令啓動編譯:

make

 

6)編譯大概2個小時。 
編譯結束後,執行安裝命令:

sudo make install

 

7)咱們切換到目標目錄下看看是否安裝成功:

cd /opt/qt-5.7.0

ls -hl

 

8)將/opt/qt-5.7.0和/opt/tslib1.4 拷貝到ARM平臺對應的文件系統中對應的目錄中。

請保證ARM平臺已成功移植Linux系統,原則上編譯Linux內核的編譯器應和編譯Qt庫的編譯器版本一致,不然會出現應用沒法運行,缺乏必要依賴庫的問題,請參看附錄《移植常見問題與解決方法》。

 

5.配置QtCreator交叉編譯環境

應用程序須要在ARM平臺上運行,也須要交叉編譯成對應平臺的可執行文件。在QtCreator下直接配置交叉編譯環境,一鍵編譯是比較簡單易行的方法。

1)在菜單中選擇Tools——Options,在彈出的對話框中,選擇Build & Run,選擇標籤Compilers,按下圖設置,選擇C++交叉編譯器,以下圖所示:

 

2)切換到Qt Versions標籤,點擊「Add」按鈕,選擇qmake,如圖所示: 

 

3)選擇完成,按「OK」按鈕,設置如圖所示: 
切換到Kits標籤,點擊「Add」按鈕,而後設置以下圖所示: 

 

 

 

6.交叉編譯待移植的應用程序

基於本SDK開發的應用軟件幾乎無需修改代碼,配置好運行環境後,直接交叉編譯經過便可在相應平臺上運行,所以只需在開發環境中一鍵交叉編譯後,按如下步驟配置運行環境便可:

 

1)把字庫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

 

2)而後在串口命令窗中輸入 vi /opt/tslib1.4/etc/ts.conf 來配置觸摸屏 
 
把第二行的註釋去掉,把ts設置成輸入模式(注意把前面的空格也去掉) 

 

3)將交叉編譯好的應用軟件拷貝到ARM平臺上測試。

 

------------------------------------------------------------------------------------------------------------------------------------------------------------

 

附錄

常見移植問題彙總

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

相關文章
相關標籤/搜索