环境: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出现的问题