MX6Q移植QT5.9.1

MX6Q移植QT5.9.1

    由于开发需要支持qml,按照网上指导,QT必须先支持opengl,在此之前尝试过gcc 4.2/4.4/4.6/4.9和qt5.6/5.8版本,均不能正确配置并支持opengl,本文绕过了众多陷阱,选择了gcc4.8.1版本(网上仅CSDN能找到付费资源,本文已经购买并开放了网盘资源)和QT LTS 5.9.1(17年发布的新版本),最终完美支持qml、qt quick和opengl。
        安装环境
        准备工作
        移植过程
        安装过程中的错误解决

由于开发需要支持qml,按照网上指导,QT必须先支持opengl,在此之前尝试过gcc 4.2/4.4/4.6/4.9和qt5.6/5.8版本,均不能正确配置并支持opengl,本文绕过了众多陷阱,选择了gcc4.8.1版本(网上仅CSDN能找到付费资源,本文已经购买并开放了网盘资源)和QT LTS 5.9.1(17年发布的新版本),最终完美支持qml、qt quick和opengl。
安装环境

所有安装需要的工具(除平台相关和系统文件)我放在了文末的百度网盘链接中
硬件平台:forlinx i.mx6Q开发板
平台内核:Linux3.0.35,因为这个老版本,导致很多低版本的编译工具无法编译qt5.8以上qmake,而高版本的编译工具无法匹配当前内核glib,最终只能找到4.8的版本完美适配。
平台Uboot 2009.08,自己修改了启动参数,主要是lvds屏参数配置,否则无法点亮。
使用系统:ubantu 14.04 32bit
编译器:arm-none-linux-gcc 4.8.1
ts版本:tslib-1.4
qt版本:qt-everywhere-opensource-src-5.9.1
移植用到的工具链接:https://pan.baidu.com/s/1cN35kHxL1yNfIid3rLMVRQ 密码:ylgq
准备工作

1、 qt5.9.1源代码
2、 编译工具链
3、 Ts-lib
4、 Forlinx自带文件系统
用到的工具
移植过程

tslib的移植参考https://blog.csdn.net/lizuobin2/article/details/52673494
1、 解压编译工具链/opt/

sudo tar -jxvf arm-none-linux-gnueabi-linux-4.8.1.tar.bz2 -C /opt/

2、 解压qt源码到当前目录

xz -d qt-everywhere-opensource-src-5.9.1.tar.xz
tar xvf qt-everywhere-opensource-src-5.9.1.tar

3、 解压文件系统到~/workspace/rootfs/下

mkdir –p ~/workspace/rootfs   

该目录是最终生成文件系统的目录
确认该编译器与内核版本一致
/opt/arm-4.8.1/arm-none-linux-gnueabi/libc/usr/include/linux/input.h
4、 将GCC4.8.1的C文件库覆盖老的文件系统的C库

sudo cp /opt/arm-4.8.1/arm-none-linux-gnueabi/libc/lib/* ~/workspace/rootfs/lib/

如果不做此处的迁移,在运行qt程序时会报各种.so文件缺失的错误
5、 修改QT的qmake.conf文件

$ cd qt-everywhere-opensource-src-5.9.1
$ vi qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf

MAKEFILE_GENERATOR      = UNIX
CONFIG                 += incremental
QMAKE_INCREMENTAL_STYLE = sublib

IMX6_CFLAGS = -march=armv7-a -mfpu=neon -DLINUX=1 -DEGL_API_FB=1
IMX6_CFLAGS_RELEASE = -O2 $$IMX6_CFLAGS
QMAKE_CFLAGS_RELEASE += $$IMX6_CFLAGS_RELEASE
QMAKE_CXXFLAGS_RELEASE += $$IMX6_CFLAGS_RELEASE
QMAKE_CFLAGS_DEBUG += $$IMX6_CFLAGS
QMAKE_CXXFLAGS_DEBUG += $$IMX6_CFLAGS

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

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

# modifications to linux.conf
QMAKE_AR                = /opt/arm-4.8.1/bin/arm-none-linux-gnueabi-ar cqs
QMAKE_OBJCOPY           = /opt/arm-4.8.1/bin/arm-none-linux-gnueabi-objcopy
QMAKE_NM                = /opt/arm-4.8.1/bin/arm-none-linux-gnueabi-nm -P
QMAKE_STRIP             = /opt/arm-4.8.1/bin/arm-none-linux-gnueabi-strip

# opengl configuration
QMAKE_INCDIR_OPENGL_ES2 = /home/roth/workspace/rootfs/usr/include
QMAKE_LIBDIR_OPENGL_ES2 = /home/roth/workspace/rootfs/usr/lib

QMAKE_INCDIR_EGL = /home/roth/workspace/rootfs/usr/include
QMAKE_LIBDIR_EGL = /home/roth/workspace/rootfs/usr/lib

QMAKE_LIBS_OPENGL_ES1 += -lGLESv1_CM -lEGL -lGAL
QMAKE_LIBS_OPENGL_ES1CL += -lGLES_CL -lEGL -lGAL
QMAKE_LIBS_EGL += -lEGL -lGAL
QMAKE_LIBS_OPENGL_ES2 += -lGLESv2 -lEGL -lGAL
QMAKE_LIBS_OPENVG += -lOpenVG -lEGL -lGAL


# Preferred eglfs backend
EGLFS_DEVICE_INTEGRATION = eglfs_viv

load(qt_config)

6、 进行配置

./configure -release \
-xplatform linux-arm-gnueabi-g++ \
-no-opengl -opengl es2 \
-prefix ~/qt5.9.1-arm \        //移植后的qt安装目录
-opensource \
-confirm-license \
-make libs \
-nomake tools \
-nomake examples \
-nomake tests \
-skip qt3d \
-skip qtandroidextras \
-skip qtcanvas3d \
-skip qtconnectivity \
-skip qtdatavis3d \
-skip qtdoc \
-skip qtgamepad \
-skip qtimageformats \
-skip qtlocation \
-skip qtmacextras \
-skip qtmultimedia \
-skip qtnetworkauth \
-skip qtpurchasing \
-skip qtsensors \
-skip qtserialbus \
-skip qtspeech \
-skip qtsvg \
-skip qttools \
-skip qtwebchannel \
-skip qtwebengine \
-skip qtwebsockets \
-skip qtwebview \
-skip qtwinextras \
-skip qtx11extras \
-no-feature-iconv \
-no-feature-gestures \
-tslib \
-I/usr/local/tslib/include/  \
-L/usr/local/tslib/lib \
-no-qml-debug

   

红色部分是qt5.9.1的安装位置
配置过程中可以看到支持了opengl
opengl开始编译并安装

make –j4  

//此处的参数视自己的配置环境,如果是8核机器可直接配置-j8,我的破机器单核安装一次约1h

make install

7、 将安装完成的qt迁移到rootfs的对应目录下

tar zcvf qt5.9.1-arm.tar.gz qt5.9.1-arm/
cp ~/qt5.9.1-arm.tar.gz ~/workspace/rootfs/opt/
cd ~/workspace/rootfs/opt/
rm -rf Qt5.6/
tar zxvf qt5.9.1-arm.tar.gz
rm qt5.9.1-arm.tar.gz

 

修改文件系统的etc/qt_env_profile.sh
环境脚本重新制作成rootfs.qt4.tar.gz

    tar -jcvf rootfs.qt4.tar.bz2 *

    1

我这里打包成这个名字是因为我的mfg工具里面配置的烧录文件系统名称为rootfs.qt4.tar.bz2,各位可以按照自己的定义来做。
安装过程中的错误解决

1 、运行qt程序时提示找不到lib/fonts目录下的字体文件
因为QT5.9默认是不带字体的,lib目录下没有fonts目录,将前面版本的qt的fonts拷贝到新版本下即可。
2、运行qt程序时显示config:No such file or directory
需要在profile中添加:export LD_PRELOAD=$TSLIB_ROOT/lib/libts.so。请各位关注自己的tslib目录设置。
3、运行程序时提示tslib相关报警
需要用同样的编译工具编译tslib,然后在配置QT时加上tslib的相关配置,主要是三条。要指定tslib编译,对应的头文件目录和lib目录
-tslib
-I/usr/local/tslib/include/
-L/usr/local/tslib/lib
4、初步测试qt程序会有以下两条告警
QIconvCodec::convertFromUnicode: using Latin-1 for conversion, iconv_open failed
QIconvCodec::convertToUnicode: using Latin-1 for conversion, iconv_open failed
这是因为缺少libiconv,需要在自己的环境下交叉编译
下载链接:http://pan.baidu.com/s/1c22xb4O 密码:pbld

mkdir -p /usr/local/libiconv
./configure --host=arm-none-linux-gnueabi --prefix=/usr/local/libiconv CC=arm-none-linux-gnueabi-gcc LDFLAGS="-L/xxx/xxx /lib" --enable-static  //红色为编译链位置
make
sudo make install

把安装目录/lib 下的 preloadable_libiconv.so 文件系统的 /lib 下, 同样,不要忘记添加环境变量,在/etc/profile 中添加 export LD_PRELOAD=/lib/preloadable_libiconv.so
5、 qt支持中文
下载字库 链接:http://pan.baidu.com/s/1bp9QFQv 密码:2u81
将DroidSansFallback.ttf 放到文件系统 /usr/local/Qt5.6/lib/fonts 目录下,虽然Qt自带了很多字库了,但是都没有中文的。
然后在使用qt creator 开发qt应用程序时,在项目中添加
QT += gui
包含头文件 #include
代码中设置使用的字体。

int id =
QFontDatabase::addApplicationFont("/opt/qt5.9.1-arm/lib/fonts/DroidSansFallback.ttf");
QString msyh = QFontDatabase::applicationFontFamilies (id).at(0);
QFont font(msyh,10);
font.setPointSize(20);
this->setFont(font);

  

在移植qt的lib/fonts目录下添加中文字库
中文雅黑msyh.tty DroidSansFallback.tty

6、调试qt程序的时候提示XDG_RUNTIME_DIR未定义
查找资料发现XDG_RUNTIME_DIR 给出的系统用户独立的运行目录,如果没有需要一定不要去定义这个变量。所以在未影响使用的情况下,暂时不去解决这个bug。
 

上一篇:web项目实战+框架(4)-复杂用例的设计


下一篇:大象做梦传媒2022企业公司创意年会邀请函范文