1. 程式人生 > >移植QT5.7到嵌入式ARM

移植QT5.7到嵌入式ARM

配置開發環境

0610更新

1、缺少標頭檔案

error: GL/gl.h: No such file or directory

執行
sudo apt-get install mesa-common-dev
2、編譯出現如下錯誤提示:
/usr/bin/ld: cannot find -lGL
執行下面命令解決:
sudo apt-get install libgl1-mesa-dev libglu1-mesa-dev

搭建NFS伺服器

  1. 檢查核心是否開啟NFS

1)進入核心原始碼目錄make menuconfig,進入選單Networking support->Networking options-> TCP/IP networking。確保nfs的功能已經被開啟
IP:BOOTP support

2)進入File systems->Network File Systems 確保nfs載入可以被使用
Root file system on NFS

  1. 搭建NFS伺服器

1)安裝NFS
apt-get install nfs-kernel-server
apt-get install nfs-common

2) 建立共享目錄,我在home/lz下建立了一個/nfs/rootfs,將其作為共享目錄。並修改許可權
chmod 777 -R /home/lz/nfs/rootfs

3) 配置NFS,開啟配置檔案並在最後一行新增
sudo gedit etc/exports
在最後一行新增
/home/lz/nfs/rootfs *(rw,sync,no_root_squash,no_subtree_check)
其中
/home/lz/nfs/rootfs:與nfs服務客戶端共享的目錄,這個路徑必須和你前面設定的檔案的路徑一致!
*:允許所有的網段訪問,也可以使用具體的IP
rw:掛接此目錄的客戶端對該共享目錄具有讀寫許可權
sync:資料同步寫入記憶體和硬碟
no_root_squash:root使用者具有對根目錄的完全管理訪問許可權。
no_subtree_check:不檢查父目錄的許可權

4)重啟NFS服務
執行命令:sudo /etc/init.d/portmap restart
sudo /etc/init.d/portmap restart
重啟portmap服務。nfs是一個RPC程式,使用它前,需要對映好埠,通過portmap設定。
注意:Ubuntu 14.04以後,要使用sudo /etc/init.d/rpcbind restart 重啟rpcbind 服務。所以執行
sudo /etc/init.d/rpcbind restart
然後執行命令:
sudo /etc/init.d/nfs-kernel-server restart
重啟nfs服務。並執行
showmount localhost -e
查詢是否成功。

  1. nfs用作嵌入式linux的檔案系統

1) 設定u-boot啟動引數
在U-Boot中設定啟動引數
U-Boot>setenv bootargs root=/dev/nfs nfsroot=192.168.1.2:/home/lz/nfs/rootfs ip=192.168.1.3:192.168.1.2:192.168.1.10:255.255.255.0::eth0:off init=/linuxrc console=ttySAC2,115200
其中:
root=/dev/nfs 並非真的裝置,而是一個告訴核心要通過網路取得根檔案系統。
nfsroot=你的主機IP:根檔案系統路徑
ip=你的開發板ip地址,注意開發板的ip地址只要和主機ip地址在一個網段內就可。
/home/lz/nfs/rootfs是主機的共享目錄(即rootfs),192.168.1.2代表的是主機ip,192.168.1.3代表開發板ip,192.168.1.10是閘道器,eth0是主機和開發板相接的網絡卡。注意這是一整行沒有換行,改完save一下。
U-Boot>sa
儲存後,用boot啟動linux
U-Boot>boot

2)掛載nfs檔案系統
在linux系統裡也可以掛載nfs檔案
sudo mount -t nfs 192.168.1.2:/home/lz/nfs/rootfs /nfs/test

安裝32位執行庫

sudo apt-get install libc6:i386
sudo -i
cd /etc/apt/sources.list.d
echo "deb http://archive.ubuntu.com/ubuntu/ raring main restricted universe multiverse" >ia32-libs-raring.list
apt-get update
apt-get install ia32-libs
rm /ia32-libs-raring.list
apt-get update
exit
sudo apt-get install gcc-multilib

下載資源

安裝交叉編譯器

$sudo apt install gcc-arm-linux-gnueabi
$sudo apt install gcc-arm-linux-gnueabihf

交叉編譯tslib1.4

對觸控式螢幕訊號的獲取、校正、濾波處理,均採用開源的tslib,本文采用的tslib版本為最新的tslib1.4(可以從本文提供的連結中下載tslib1.4)。
1.將下載好的tslib1.4拷貝到/home/lz/transplant目錄下(可以根據自己的系統選擇某一目錄),然後執行解壓縮命令

tar -vxf tslib-1.4.tar.gz

切換到tslib目錄:

cd tslib

安裝交叉編譯tslib必須的一些工具(可以先檢視是否已安裝,ubuntu16.04自帶這些工具,可跳過)

sudo apt-get install autoconf
sudo apt-get install automake
sudo apt-get install libtool

2.利用指令碼寫編譯過程
在tslib資料夾下新建檔案configTslib14.sh

vi configTslib14.sh

內容如下:

#!/bin/sh
make clean && make distclean
echo "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成功。

交叉編譯QT庫

將下載的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

修改交叉編譯架構用到的資訊:

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-linux-gnueabi-gcc
QMAKE_CXX               = arm-linux-gnueabi-g++
QMAKE_LINK              = arm-linux-gnueabi-g++
QMAKE_LINK_SHLIB        = arm-linux-gnueabi-g++

# 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)

建立一個指令碼檔案,用於生成Makefile,執行命令

gedit autoConfigure.sh

輸入下面內容並儲存:

#!/bin/sh
./configure \
    -v \
    -prefix /opt/arm-qt \
    -qmldir /opt/arm-qt/qml2 \
    -release \
    -opensource \
    -confirm-license \
    -make libs \
    -xplatform linux-arm-gnueabi-g++ \
    -optimized-qmake \
    -pch \
    -qt-sql-sqlite \
    -qt-libjpeg \
    -qt-zlib \
    -tslib \
    -no-opengl \
    -no-sse2 \
    -no-openssl \
    -no-nis \
    -no-cups \
    -no-glib \
    -no-pkg-config \
    -no-separate-debug-info \
    -make tools \
    -tslib \
    -skip qtvirtualkeyboard \
    -I/opt/tslib1.4/include \
    -L/opt/tslib1.4/lib
exit

執行命令:

chmod 777 qt.configure.sh
./autoConfigure.sh

上述命令自動生成Makefile檔案。
執行命令啟動編譯:

    make  -j5

編譯大概四十分鐘
編譯結束後,執行安裝命令:

    sudo make install

將/opt/arm-qt 和/opt/tslib1.4 拷貝到開發板的檔案系統中對應的目錄中。

設定QT的交叉編譯環境

安裝qtcreator
進入qtcreator開發環境
在選單中選擇Tools——Options,在彈出的對話方塊中,選擇Build & Run,選擇標籤Compilers,按下圖設定,選擇C++交叉編譯器,如下圖所示:

切換到Qt Versions標籤,點選“Add”按鈕,選擇qmake,如圖所示:

選擇完成,按“OK”按鈕,設定如圖所示:
切換到Kits標籤,點選“Add”按鈕,然後設定如下圖所示:

在4412開發板上配置tslib並交叉編譯一個能夠在4412開發板上執行的QT應用程式

把字型檔Ubuntu_L.ttf 等字型檔拷貝到 /opt/arm-qt/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

然後在串列埠命令窗中輸入 vi /opt/tslib1.4/etc/ts.conf 來配置觸控式螢幕

把第二行的註釋去掉,把ts設定成輸入模式(注意把前面的空格也去掉)

將編譯得到的可執行檔案拷貝到開發板中檔案系統的/bin目錄,執行該程式。

注意:不用開發板的觸控式螢幕輸入裝置不一樣,如tiny4412是dev下的1-wire字樣的輸入裝置。需要修改TSLIB_TSDEVICE。