提示:较新版本的Qt使用了C++11语法,所以必须使用gcc4.8.0及以上版本
# 在/etc/bash.bashrc的最后增加如下指令
# Native Compiler
export AR_host="ar"
export CC_host="gcc"
export CXX_host="g++"
export LINK_host="g++"
# freescale imx.6 cross compiler, BoxV1
export ARCH=arm
export PATH=/opt/zhaozhongxiang/hwzt_yc_3.10.53/build-x11/tmp/sysroots/x86_64-linux/usr/bin/cortexa9hf-vfp-neon-poky-linux-gnueabi/:$PATH
# 修改完成之后需要重启命令行才能生效
将sysroot拷贝到 /opt/zhaozhongxiang/hwzt_yc_3.10.53/build-x11/tmp/sysroots
,因为Qt的依赖库比较多,所以建议针对目标器件建立sysroot目录,这里imx.6使用Ycoto生成的sysroot。如果sysroot过于精简,在执行配置脚本可能会出现依赖库缺失的情况,需要自己单独编译依赖库然后拷贝到sysroot目录,本文档将不单独介绍这部分内容。
另外需要着重注意sysroot对应的imx6qsabresd目录下存在之前编译的旧Qt版本的动态库,必须进行清除操作,否则将会影响新版本Qt的编译。
cd /opt/zhaozhongxiang/hwzt_yc_3.10.53/build-x11/tmp/sysroots/imx6qsabresd
sudo rm ./usr/lib/libQt* -rf
sudo rm ./usr/lib/qt5 -rf
因为编译环境涉及到使用64位Ubuntu操作系统交叉编译32位应用程序,所以需要另外安装一些依赖库。
sudo apt-get install gperf bison
sudo apt-get install ninja-build
sudo apt-get install libc6-dev-i386
针对Ubuntu16.04 64位操作系统:
sudo apt-get install gcc-multilib g++-multilib
针对Ubuntu14.04 64位操作系统:
sudo apt-get install gcc-4.8-multilib g++-4.8-multilib
在Qt源代码根目录创建build_configure.sh,内容如下:
#!/bin/bash
# configure bash for qt5.9.6
./configure -v \
-opensource -confirm-license \
-sysroot /opt/zhaozhongxiang/hwzt_yc_3.10.53/build-x11/tmp/sysroots/imx6qsabresd \
-no-gcc-sysroot \
-prefix /usr/local/Qt-5.9.6 \
-device linux-imx6-g++ \
-device-option CROSS_COMPILE=/opt/zhaozhongxiang/hwzt_yc_3.10.53/build-x11/tmp/sysroots/x86_64-linux/usr/bin/cortexa9hf-vfp-neon-poky-linux-gnueabi/arm-poky-linux-gnueabi- \
-release -shared -make libs -verbose \
-no-pch \
-no-rpath -pkg-config -accessibility -no-alsa -icu -dbus -no-glib \
-no-directfb -eglfs -no-kms -linuxfb -xcb -xcb-xlib \
-evdev -no-libinput -xinput2 -no-tslib -libudev -no-mtdev \
-nomake examples -nomake tests \
-fontconfig \
-no-opengl -opengl es2 -egl -no-openvg \
-system-zlib -system-libjpeg -system-libpng -system-xcb \
-openssl-linked -qt-pcre -pulseaudio -no-sm \
-no-sql-db2 -no-sql-ibase -no-sql-mysql -no-sql-oci -no-sql-odbc -no-sql-psql -no-sql-sqlite2 -no-sql-tds \
-widgets -xkb
上述备注主要涉及到(按顺序):
qtbase/mkspecs/devices
目录寻找提示:QPA:即QT平台抽象层,具体解释见参考文档4
通过configure脚本只是开启对各个QPA平台的校验,不意味成已经开启相应平台的支持,具体是否校验成功需要查看configure脚本最终打印的输出列表信息,如下图所示:
从上图可以看到EGLFS i.Mx6的支持并没有开启,原因为sysroot中的EGL依赖库不是GPU版本,必须使用官方提供的GPU版本,将如下依赖库进行替换:
另外在重新配置之前需要再替换一些动态库:
提示:上述动态库可以通过这里下载(下载地址)
重新执行build_configure.sh
rm config.cache
./build_configure.sh
提示:这里必须先清除config.cache才能重新进行一次配置检测,否则配置不会更新,更新之后的QPA信息如下图:
在进行原始版本的Qt-5.9.6实际Webengine页面测试时发现html中的select
元素(即下拉菜单)的位置会偏移到屏幕的左上角。如果应用程序需要使用Webengine模块建议按照下面的步骤修复这个Bug。
修改 qtbase/src/widgets/kernel/qwidgetbackingstore.cpp
文件中的 findTextureWidgetsRecursively
函数:
// 修改
if (wd->renderToTexture) {
QPlatformTextureList::Flags flags = 0;
if (widget->testAttribute(Qt::WA_AlwaysStackOnTop))
flags |= QPlatformTextureList::StacksOnTop;
const QRect rect(widget->mapTo(tlw, QPoint()), widget->size());
widgetTextures->appendTexture(widget, wd->textureId(), rect, wd->clipRect(), flags);
}
// 为
if (wd->renderToTexture) {
QPlatformTextureList::Flags flags = 0;
if (widget->testAttribute(Qt::WA_AlwaysStackOnTop))
flags |= QPlatformTextureList::StacksOnTop;
if ((widget->windowFlags() & Qt::WindowType_Mask) == Qt::ToolTip) {
const QRect rect(widget->pos(), widget->size());
widgetTextures->appendTexture(widget, wd->textureId(), rect, wd->clipRect(), flags);
} else {
const QRect rect(widget->mapTo(tlw, QPoint()), widget->size());
widgetTextures->appendTexture(widget, wd->textureId(), rect, wd->clipRect(), flags);
}
}
make -j8
make install
编译和安装正常完成之后会生成sysroot
下的usr/local/Qt-5.9.6
目录