環境:Ubuntu-18.04 64位
交叉編譯器:arm-hisiv600-linux
有關 Qt 的嵌入式相關開發,最好的參考資料就是Qt文檔:Qt for Embedded Linux
該英文文檔的翻譯版本:Qt5.7 Qt for Embedded Linux
首先,有必要區分幾個名詞:Qt,Qt/E,Qtopia Core, Qtopia。(引用自Qt中文論壇)
Qt泛指Qt的所有桌面版本,比如Qt/X11,Qt Windows,Qt Mac等。由於Qt最早是在Linux中隨着KDE流行開來的,因此通常很多人說的Qt都指用於Linux/Unix的Qt/X11。
Qt/E(Qt/Embedded)是用於嵌入式Linux系統的Qt版本。Qt/E去掉了X Lib的依賴而直接工作於Frame Buffer上,因而效率更高,但它並不是Qt的子集,而應該是超集,部分機制(如QCOP等)不能用於Qt/X11中。
Qtopia是一個構建於Qt/E之上的類似桌面系統的應用環境。相比之下,Qt/E是基礎類庫。
Qtopia Core:就是原來的Qt/E,大概從Qt 4開始改名,把Qtopia Core並到Qtopia的產品線中去了。但實際上Qtopia Core就相當於原來的Qt/E,仍然作為基礎類庫。
另外,似乎奇趣最近又把Qtopia Core改名叫做Qt for Embedded Linux了,不知道是不是因為Qtopia Core搞得大家都很糊塗,沒人來買的緣故。
一、安裝交叉編譯器
【注意】本文中使用 Hi3531D 的 V600 編譯器,海思SDK文件可自行搜索下載。(安裝目錄權限要求為 root 用戶,所以部分命令使用了 sudo)
1、解壓海思SDK
$ tar -xvf Hi3531D V100R001C02SPC040.zip
2、進入到交叉編譯工具目錄
$ cd Hi3531D V100R001C02SPC040
3、 解壓交叉編譯工具
$ ./sdk.unpack
在 Ubuntu 中執行該命令,會報錯:./sdk.unpack source: not find,解決方法為:sudo dpkg-reconfigure dash,彈出提示框后選擇 No。
4、安裝交叉編譯工具
$ cd osdrv/opensource/toolchain/arm-hisiv600-linux
$ sudo mkdir -p /opt/hisi-linux/x86-arm/arm-hisiv600-linux
$ sudo ./cross.v600.install
5、更新 shell 的環境變量
$ . /etc/profile
【注意】中間有一個空格,與 source /etc/profile 的作用一樣,都是讓剛剛安裝軟件的環境變量一直有效。
二、靜態編譯Qt5
先下載 qt-everywhere-src-5.13.2.tar.xz,下載地址: http://download.qt.io/archive/qt/
1、解壓海思SDK
$ tar -zxvf qt-everywhere-src-5.13.2.tar.xz
不要加上 sudo,否則解壓目錄的權限要求變為 root,會導致查找不到編譯器,后續編譯報錯,后續命令也一樣不加 sudo。
2、配置交叉編譯器
$ cd qt-everywhere-src-5.13.2/qtbase/mkspecs/devices
$ cp -rf linux-imx7-g++ linux-arm-hisilicon-hi3531d-g++
$ vi linux-arm-hisilicon-hi3531d-g++/qmake.conf
:%s/IMX7_CFLAGS/HI3531D_CFLAGS/g
:g/DISTRO_OPTS/d
:wq
$ cd ../../../
使用現成的 linux-imx7-g++,將其拷貝成 linux-arm-hisilicon-hi3531d-g++,再修改其 qmake.conf,則 g++ 編譯器配置成功。
3、創建安裝目錄
$ mkdir -p /usr/local/qt-5.13.2-hisiv600-static
4、配置 qt 的編譯參數
$ ./configure -prefix /usr/local/qt-5.13.2-hisiv600-static -static -opensource -confirm-license -sql-sqlite -qt-freetype -nomake examples -no-opengl -no-gif -device linux-arm-hisilicon-hi3531d-g++ -device-option CROSS_COMPILE=arm-hisiv600-linux- -qt-zlib -qt-libjpeg -qt-libpng -no-compile-examples -nomake tools -skip qtserialbus -no-iconv -qt-freetype
參數說明:
-
-prefix /usr/local/qt-5.12.8-hisiv600-static 指明靜態編譯的 Qt 安裝的目錄。
-
-static 指的是采用靜態編譯
-
-opensourcec 指定編譯和鏈接 Qt 開源版本
-
-confirm-license 表示自動確認許可證
-
-sql-sqlite 支持數據庫
-
-qt-freetype 使用 Qt 自帶的 libfreetype
-
-nomake examples 在構建時排除 examples 組件
-
-no-opengl 禁用 OpenGL 支持
-
-no-gif 不要編譯GIF讀取支持
-
-device linux-arm-hisilicon-hi3531d-g++ 跨平台編譯"海思編譯器"設備
-
-device-option CROSS_COMPILE=arm-hisiv600-linux- 添加device mkspec的device選項
-
-qt-zlib 使用 Qt 自帶 zlib 庫
-
-qt-libjpeg 使用 Qt 自帶的 libjpeg
-
-qt-libpng 使用 Qt 自帶的 libpng
-
-no-compile-examples 僅安裝 examples 的源碼,不要編譯它
-
-skip qtserialbus 排除整個 qtserialbus 模塊的建立
-
-no-iconv 不編譯對 iconv(3) 的支持
-
-tslib 編譯對 tslib 的支持
更多參數說明請參考:linux下編譯qt5.6.0靜態庫
【注意】Qt5.8以上的版本不能直接支持 tslib,要換成Qt5.8以下的版本。在后面加上:
-tslib -I/home/temp/tslib/include -L/home/temp/tslib/lib
5、執行編譯
make -j8
6、安裝
make install -j8
在 /usr/local/qt-5.13.2-hisiv600-static/ 就是編譯好的 Qt。
參考:
[2]_解決在海思SDK包中的執行 ./sdk.unpack出現的問題