移植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伺服器
- 檢查核心是否開啟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
- 搭建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
查詢是否成功。
- 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。