手里有块 AnyCloud37D 平台的 armv5 开发板,想在上面展示浏览器控件。开发板自带 Qt 4.8.7 版本,但是缺少 QtWebkit 库。本文记录在 Ubuntu 20.04 LTS 主机上交叉编译 Qt 4.8.7 的步骤及遇到的问题的解决方案。

1 Qt 4.8.7 源码获取

官方链接:https://download.qt.io/archive/qt/4.8/4.8.7/qt-everywhere-opensource-src-4.8.7.tar.gz

tar -xzf qt-everywhere-opensource-src-4.8.7.tar.gz
cd qt-everywhere-opensource-src-4.8.7

2 环境配置

2.1 主机环境

Ubuntu 20.04 LTS 默认的 gcc 版本是 gcc-9,然而对于 Qt 4.8.7 来说 gcc-9 版本过新,编译过程中会出问题,需要使用 gcc-8 版本方能顺利编译。

sudo apt install -y gcc-8 g++-8

查看系统是否已配置 gcc 软链接

sudo update-alternatives --config gcc

将 gcc-8 和 gcc-9 添加到软链,数字代表优先级

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 20 --slave /usr/bin/g++ g++ /usr/bin/g++-8
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 30 --slave /usr/bin/g++ g++ /usr/bin/g++-9

执行以下命令按提示配置系统的 gcc 默认版本

sudo update-alternatives --config gcc

2.2 开发板环境

2.2.1 基础信息

此开发板 CPU 型号是 AK3760D,架构是 armv5tejl。

查看开发板字节顺序是大端还是小端

echo -n I | od -o | head -n1 | cut -f2 -d" " | cut -c6

或者

echo -n I | od -o | head -n1 | awk '{print $2}'| cut -c6

输出 1 为小端模式,0 为大端模式。

此开发板输出 1,为小端模式。

2.2.2 交叉编译工具链

自行寻找对应该平台的交叉编译工具链。

将交叉编译工具链安装到 Ubuntu 主机的 /opt

/opt/arm-anykav500-linux-gnueabi

gcc:/opt/arm-anykav500-linux-gnueabi/usr/bin/arm-anykav500-linux-gnueabi-gcc g++:/opt/arm-anykav500-linux-gnueabi/usr/bin/arm-anykav500-linux-gnueabi-g++

3 Qt 4.8.7 编译

编辑qt-everywhere-opensource-src-4.8.7/mkspecs/qws/linux-arm-gnueabi-g++/qmake.conf

#
# qmake configuration for building with arm-anykav500-linux-gnueabi-g++
#

QMAKE_CFLAGS_RELEASE = -O3 -march=armv5
QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE

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

# modifications to g++.conf
QMAKE_CC                = /opt/arm-anykav500-linux-gnueabi/usr/bin/arm-anykav500-linux-gnueabi-gcc
QMAKE_CXX               = /opt/arm-anykav500-linux-gnueabi/usr/bin/arm-anykav500-linux-gnueabi-g++
QMAKE_LINK              = /opt/arm-anykav500-linux-gnueabi/usr/bin/arm-anykav500-linux-gnueabi-g++
QMAKE_LINK_SHLIB        = /opt/arm-anykav500-linux-gnueabi/usr/bin/arm-anykav500-linux-gnueabi-g++

# modifications to linux.conf
QMAKE_AR                = /opt/arm-anykav500-linux-gnueabi/usr/bin/arm-anykav500-linux-gnueabi-ar cqs
QMAKE_OBJCOPY           = /opt/arm-anykav500-linux-gnueabi/usr/bin/arm-anykav500-linux-gnueabi-objcopy
QMAKE_STRIP             = /opt/arm-anykav500-linux-gnueabi/usr/bin/arm-anykav500-linux-gnueabi-strip

load(qt_config)

执行 configure

./configure -prefix /opt/qt-4.8.7 -release -opensource -confirm-license -webkit -no-openssl -nomake demos -nomake examples -nomake tests -optimized-qmake -no-script -xplatform qws/linux-arm-gnueabi-g++ -device-option CROSS_COMPILE=/opt/arm-anykav500-linux-gnueabi/usr/bin/arm-anykav500-linux-gnueabi-g++ -little-endian -no-qt3support -embedded arm

configure 命令里的某些 options 与上文某些操作是对应的。

按提示继续执行

make -j2
sudo make install

至此,适用于目标开发板的 Qt 4.8.7 编译完成,库等产物在指定的安装目录下:/opt/qt-4.8.7

若需要重新 configure,先执行清理操作

make confclean