嵌入式Linux Qt移植詳細過程

嵌入式Linux下的Qt移植詳細過程

開發說明

前段時間需要用開發板寫一個下位機程序,是基於Linux系統,就想着用Qt來寫,於是上網找教程看如何移植到開發板上。由於我不熟悉嵌入式Linux,加上網上的教程大多都有不少坑,移植過程搞了幾天,實在難受,故記錄下移植過程,作爲記錄,也爲需要的人提供參考。

我用來編譯qt的主機是Ubuntu18系統,用的是VM虛擬機。要移植的開發板的架構是Cortex-72A。

資源以及下載地址

  1. tslib1.2.1源碼(觸摸屏需要用到tslib)

    tslib1.2.1

  2. qt5.12.9源碼

    qt-everywhere-src-5.15.2.tar.xz

  3. 交叉編譯器aarch64-linux-gnu-gcc/aarch64-linux-gnu-g++或者gcc-arm-linux-gnueabi

sudo apt-get install aarch64-linux-gnu-gcc

sudo apt-get install aarch64-linux-gnu-g++

sudo apt-get install gcc-arm-linux-gnueabi

sudo apt-get install g++-arm-linux-gnueabi

或者去官網ARM 直接下載你需要的交叉編譯器。安裝aarch64或者gnueabi任意一個編譯器即可。

  1. 配置工具

sudo apt-get install libtool autogen autoconf automake

編譯tslib

  1. 記住你用的是哪個交叉編譯器進行編譯的,下面編譯Qt需要用到同樣的交叉編譯器。

  2. 解壓下載好的源碼,進入根目錄。

  3. 進行configure

CC=/usr/bin/arm-linux-gnueabi-g++ ./configure --host=arm-linux-gnueabi --prefix=/home/tslib1.2.1

CC指定交叉編譯器,host指定平臺,prefix指定生成的庫放在哪個目錄,可以自定義。

  1. make and make install

make

然後

make install

等待make install 結束就可以在/home/tslib1.2.1目錄下看到生成tslib.

編譯Qt

  1. 解壓qt5.12.9源碼,進入根目錄。

tar -vxf everywhere-src-5.12.9.tar.xz

cd everywhere-src-5.12.9

  1. 修改qmake.conf

我用的交叉編譯器是linux-arm-gnueabi-g++,所以進入qt源碼目錄下的/qtbase/mkspecs/linux-arm-gnueabi-g++/ 找到qmake.conf進行修改。

如果你用的是其它交叉編譯器,那需要進入到對應編譯器的目錄修改

aarch64進入qtbase/mkspecs/linux-aarch64-gun-g++/

其它找對應目錄即可。

qmake.conf添加以下三行:

QT_QPA_DEFAULT_PLATFORM = linuxfb
QMAKE_CFLAGS_RELEASE += -O2 -march=armv8-a
QMAKE_CXXFLAGS_RELEASE += -O2 -march=armv8-a

修改後:

AKEFILE_GENERATOR = UNIX
CONFIG += incremental
QMAKE_INCREMENTAL_STYLE = sublib

# 添加以下三行

QT_QPA_DEFAULT_PLATFORM = linuxfb
QMAKE_CFLAGS_RELEASE += -O2 -march=armv8-a
QMAKE_CXXFLAGS_RELEASE += -O2 -march=armv8-a

include(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)

# modifications to g++.conf

QMAKE_CC = arm-linux-gnuebai-gcc # 指定編譯器
QMAKE_CXX = arm-linux-gnuebai-g++
QMAKE_LINK = arm-linux-gnuebai-g++
QMAKE_LINK_SHLIB = arm-linux-gnuebai-g++

# modifications to linux.conf

QMAKE_AR =arm-linux-gnuebai-ar cqs
QMAKE_OBJCOPY = arm-linux-gnuebai-objcopy
QMAKE_NM = arm-linux-gnuebai-nm -P
QMAKE_STRIP = arm-linux-gnuebai-strip
load(qt_config)

  1. 編寫配置文件

新建一個腳本文件myconfig.sh,寫入以下內容。有幾項需要根據自己情況修改

-prefix 指定生成文件的目錄

-l/home/tslib1.2.1/include 修改成上面編譯好的tslib對應路徑

-L/home/tslib1.2.1/lib 修改成上面編譯好的tslib對應路徑

-xplatform 平臺目標,交叉編譯時的目標平臺

configure參數的意思用法參考 Qt configure參數詳解 .

./configure -prefix /home/forlinx/qt5.12.9
-opensource
-confirm-license
-release
-strip
-shared
-xplatform linux-arm-gnuabi-g++
-optimized-qmake
-c++std c++11
--rpath=no
-pch
-skip qt3d
-skip qtactiveqt
-skip qtandroidextras
-skip qtcanvas3d
-skip qtconnectivity
-skip qtdatavis3d
-skip qtdoc
-skip qtgamepad
-skip qtlocation
-skip qtmacextras
-skip qtnetworkauth
-skip qtpurchasing
-skip qtremoteobjects
-skip qtscript
-skip qtscxml
-skip qtsensors
-skip qtspeech
-skip qtsvg
-skip qttools
-skip qttranslations
-skip qtwayland
-skip qtwebengine
-skip qtwebview
-skip qtwinextras
-skip qtx11extras
-skip qtxmlpatterns
-skip qtdeclarative
-make libs
-make examples
-nomake tools -nomake tests
-gui
-widgets
-dbus-runtime
--glib=no
--iconv=no
--pcre=qt
--zlib=qt
-no-openssl
--freetype=qt
--harfbuzz=qt
-no-opengl
-linuxfb
--xcb=no
-tslib
--libpng=qt
--libjpeg=qt
--sqlite=qt
-plugin-sql-sqlite
-I/home/tslib1.2.1/include
-L/home/tslib1.2.1/lib
-recheck-all

這裏注意一下格式,如果你從windows複製腳本到虛擬機的linux下,那個換行格式可能導致configure的時候有錯誤. Windows下換行是\r\n 。linux下是\n。這個問題也搞了我挺久的。

  1. 編譯

在qt源碼根目錄下執行剛纔編寫好的腳本文件,並且make && make install.

編譯的過程要挺久十幾分鍾到幾個小時不等。

chmod 777 myconfig.sh

./myconfig.sh

make -j4

make install

如果上面的過程有問題,根據提示進行修改.

移植

  1. 將生成好的tslib和qt5.12.9複製到開發板上。

  1. 配置環境變量

修改/etc/profile文件,在末尾添加以下內容。

路徑根據自己情況修改

TSLIB_ROOT tslib的路徑

QT_ROOT qt 的路徑

export TSLIB_ROOT=/root/qtres/tslib_result
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_TSDEVICE=/dev/input/event0
export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf
export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts
export TSLIB_CALIBFILE=/etc/pointercal

export QT_ROOT=/root/qtres/qt5.12.9
export QT_QPA_GENERIC_PLUGINS=tslib:/dev/input/event0
export QT_QPA_FONTDIR=/usr/share/fonts
export QT_QPA_PLATFORM_PLUGIN_PATH=$QT_ROOT/plugins
export QT_QPA_PLATFORM=linuxfb:tty=/dev/fb0
export QT_PLUGIN_PATH=$QT_ROOT/plugins
export LD_LIBRARY_PATH=$QT_ROOT/lib:$QT_ROOT/plugins/platforms:$TSLIB_ROOT/lib:$QT_ROOT/bin
export QML2_IMPORT_PATH=$QT_ROOT/qml
export QT_QPA_FB_TSLIB=1

使文件生效.

source /etc/profile

到此,qt5.12.9移植完成。

配置QCreator開發環境

  1. 一般不直接在開發板上開發,而是在另外的系統上編寫好程序,再放到開發板上運行。

  2. 安裝qcreator。Qt的IDE。

sudo apt-get install qtcreator

  1. 用上面編譯好的qt5.12.9和交叉編譯器配置qcreator

配置qmake(在編譯好的qt/bin/)

配置交叉編譯器(配置我們之前安裝的交叉編譯器)

生成的程序移植到開發板上運行。

一些問題

這個Qt移植會出現各種各樣的問題,有些問題卡了好久,Google上也沒有找到好的解決,歸根到底還是不懂原理,只是照着別人的步驟來,由於別人的系統和板子和你不同,問題自然很多。不過我不是搞嵌入式方面的,只是需要用到纔去搞的,所以也不深究原理。如果是研究這方面的,一定要把原理搞清楚,就不至於移植個Qt都這麼麻煩。

有問題多百度和Google。

星期五女孩

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