最近由于手上的ARM开发板升级到了3.14,所以也打算将Qt的开发环境由4.8.5 升级到 5.7/5.9 。主要是因为实际使用发现,在4.8.5的平台上Qt有不少的Bug,由此担心稳定性问题。另外,Qt5是Qt的未来,借此可以进一步学习Qt5的开发,新的系统所配置的交叉编译工具链也支持c++11的开发,借此也可以体验下。

准备

  1. 准备一个Linux 64位的机器,虚拟机也行。
  2. 准备一个嵌入式交叉编译工具,这里我用的是 gcc-linaro-4.9-2016.02-x86_64_arm-linux-gnueabihf.tar.xz
    并且配置好环境变量:
    1
    2
    3
    export ARCH=arm
    export CROSS_COMPILE=/opt/arm-linux-gnueabihf/bin/arm-linux-gnueabihf-
    export PATH=/opt/arm-linux-gnueabihf/bin/:$PATH
  3. 下载Qt5.7源码
  4. 创建编译后的安装目录 /opt/qt570-arm

编译

编译Qt SDK

自定义xplatform平台

进入qtbase/mkspec,修改现有的平台linux-g++ linux-arm-gnueabi-g++下的qmake.conf文件。支持linuxfb插件的配置修改后的内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#
# qmake configuration for building with arm-linux-gnueabi-g++
#

MAKEFILE_GENERATOR = UNIX
CONFIG += incremental
QMAKE_INCREMENTAL_STYLE = sublib
QT_QPA_DEFAULT_PLATFORM = linuxfb
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-gnueabihf-gcc
QMAKE_CXX = arm-linux-gnueabihf-g++
QMAKE_LINK = arm-linux-gnueabihf-g++
QMAKE_LINK_SHLIB = arm-linux-gnueabihf-g++

# modifications to linux.conf
QMAKE_AR = arm-linux-gnueabihf-ar cqs
QMAKE_OBJCOPY = arm-linux-gnueabihf-objcopy
QMAKE_NM = arm-linux-gnueabihf-nm -P
QMAKE_STRIP = arm-linux-gnueabihf-strip
load(qt_config)

使用configure工具生成makefile

进入到源码根目录,创建一个build.sh文件,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/bin/sh

./configure -verbose \
-prefix /opt/qt570-arm \
-opensource \
-confirm-license \
-release \
-shared \
-xplatform linux-arm-gnueabi-g++ \
-optimized-qmake \
-pch \
-qt-sql-sqlite \
-qt-libjpeg \
-qt-zlib \
-qt-libpng \
-no-opengl \
-no-sse2 \
-no-openssl \
-no-nis \
-no-opengl \
-no-cups \
-no-glib \
-no-separate-debug-info \
-no-accessibility \
-nomake examples \
-nomake tests \
-nomake tools \
-skip qtvirtualkeyboard

其中最重要的就是 -prefix /opt/qt570-arm-xplatform linux-arm-gnueabi-g++ 这2个选项。这里在前面已经处理好了,/opt/qt570-arm 表示安装目录; linux-arm-gnueabi-g++ 对应 qtbase/mkspec目录下的linux-arm-gnueabi-g++平台文件,编译会根据此目录下的qmake来配置生成makefile。

注意:编译Qt5.9手续要的configure配置与5.7有少许的不同,有些配置选项是无效的,根据提示删除不支持的选项即可。

make && make install

前面一步成功之后,使用sudo make -j2 执行即可。编译完成后,再使用sudo make install。

编译tslib

由于我暂时不需要用到触摸板,因此并不需要tslib库。如有需要,可以上网进一步查询资料进行交叉编译即可

交叉编译libiconv-1.15

交叉编译libiconv-1.15会得到preloadable_libiconv.so库,交叉编译的命令如下:

1
2
3
./configure CC=arm-linux-gnueabihf-gcc --prefix=/home/dejary/libiconv-1.15-arm --host=arm-linux
$ make
$ make install

preloadable_libiconv.so在安装目录lib中(/home/dejary/libiconv-1.15-arm/lib)

交叉编译gdb

QtCreator配置

部署和运行

启动程序前必须先设置好相关的环境变量,按照如下的设置即可。

1
2
3
4
5
6
7
8
export QTDIR=/opt/qt570-arm
export PATH=$T_ROOT/bin:$PATH
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$QTDIR/lib:/lib:/usr/local/lib
export QT_QPA_PLATFORM_PLUGIN_PATH=$QTDIR/plugins
export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0:size=800x480
#export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0:size=480x272:mmsize=95x53:offset=0x0
export QT_QPA_FONTDIR=$QTDIR/lib/fonts
export LD_PRELOAD=/usr/lib/preloadable_libiconv.so

上述的设置都是必需的选项,其它含义也比较清晰明确。

参考资料

  1. ubuntu16.04编译ARM版Qt5.7.0+开发板远程调试