Hi3519AV100移植Qt5.9.9

起源:

因为Hi3519AV100跑的是Linux系统,所以决定采用QT来做界面展示。当前最新的QT版本是5.15,但是QT5.9是长期维护的版本,因此选择了QT5.9.9版本。

源码下载:

在Qt官网上下载Qt5.9.9源代码qt-everywhere-opensource-src-5.9.9.tar.xz

解压源码

tar xvJf qt-everywhere-opensource-src-5.9.9.tar.xz

配置交叉编译器

因为Qt5.9.9支持C++11,所以编译器版本需要高于4.8以上,我选择了6.3.1(因为给我们提供算法的公司采用的是这个版本-_-||)。

修改~/.bashrc 文件,在系统环境变量PATH中添加交叉编译器的路径。(路径以实际路径为准)

export PATH=/opt/hisi-linux/x86-arm/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabi/bin:$PATH

执行命令

source ~/.bashrc

查看交叉编译器的路径是否已经添加到系统环境变量PATH中,可以通过查看交叉编译器版本号来进行判断。

arm-linux-gnueabi-gcc -v

如果能正常显示交叉编译器的版本号,则证明配置成功!

配置qmake.conf

cd /opt/Qt/qt-everywhere-opensource-src-5.9.9

vi ./qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf

因为我们现在用的交叉编译器名称正好和这个文件中的名称是一样的,所以不需要进行任何修改。如果交叉编译器为“arm-himix200-linux-gcc”与默认的不一样,则将“arm-linux-gnueabi”全部替换为“arm-himix200-linux”

配置生成MakeFile文件

cd /opt/Qt/qt-everywhere-opensource-src-5.9.9
./configure -prefix /opt/Qtlib/qt-5.9.9 -release -opensource -confirm-license \

-platform linux-g++ -xplatform linux-arm-gnueabi-g++ \

-qt-zlib -qt-libpng -qt-libjpeg -qt-freetype \

-no-pch -no-avx -no-openssl -no-cups -no-dbus -no-opengl -no-glib \

-skip qtwebchannel -skip qtcanvas3d \

-evdev -nomake examples -nomake tests
  • -prefix /opt/Qtlib/qt-5.9.9 指定最终的安装路径为/opt/Qtlib/qt-5.9.9;
  • -platform linux-g++ 指的是你在什么机器上编译这些文件,一般都是ubuntu或者centeros,-xplatform指的是程序要运行在什么平台,linux-g++会用来编译一些使用工具,像生成.qch帮助文档的qhelpgenerator,xplatform则指定编译库代码时用的编译器,以及生成make所有的qmake工具;
  • -xplatform 所指定的不是交叉编译工具链的名字,而是交叉编译配置文件的名字,该文件需在/opt/Qt/qt-everywhere-opensource-src-5.9.9/qtbase/mkspecs/目录下,可以拷贝linux-arm-gnueabi-g++,然后根据自己交叉编译工具修改qmake.conf;
  • -qt-zlib -qt-libpng -qt-libjpeg -qt-freetype 这几个选项最好使用qt库自带的源码,不然如果系统上没有这个库或者找不到,自行编译这些库后再加入到相关路径上还需要为这些库写依赖文件才能使用,没有依赖文件,链接程序时会报一些插件找不到的错误;
  • -evdev 用于鼠标键盘;

编译和安装

make
make install

接下来就是漫长的等待,整个编译过程大概需要2个小时。

移植QT库到ARM

等编译完后,/opt/Qtlib/qt-5.9.9路径下的文件就是我们所需要移植到ARM板子上的东西了。将其放到板子相对应的路径下。

配置ARM的QT环境变量

设置ARM板的QT环境变量,在/etc/profile中添加如下内容:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib:/opt/Qtlib/qt-5.9.9/lib
export QT_QPA_PLATFORM_PLUGIN_PATH=/opt/Qtlib/qt-5.9.9/plugins
export QT_QPA_PLATFORM=linuxfb:tty=/dev/fb0
export QT_QPA_FONTDIR=/opt/Qtlib/qt-5.9.9/lib/fonts

其中fonts在编译的时候不会自动生成,可以去网上自己下载一个。推荐一个网址:http://www.zhaozi.cn/s/all/ttf/上面有好多可以选择。^-^

警告

如果在运行QT程序时,会出现如下提示

QIconvCodec::convertToUnicode: using Latin-1 for conversion, iconv_open failed
QIconvCodec::convertFromUnicode: using Latin-1 for conversion, iconv_open failed

移植libiconv-1.14,就可以解决此问题。

tar xvzf libiconv-1.14.tar.gz
cd libiconv-1.14
./configure -prefix=$PWD/install -host=arm-linux-gnueabi
make && make install

如果在make过程中出现如下提示:

./stdio.h:1010:1: error: ‘gets’ undeclared here (not in a function)
_GL_WARN_ON_USE (gets, “gets is a security hole - use fgets instead”);

报错说gets没有声明到,请用fgets替换,在C89以上,gets是不推荐用的啦,我们在本目录中执行:

vi srclib/stdio.in.h

接着搜索到:

_GL_WARN_ON_USE (gets, “gets is a security hole - use fgets instead”); 这一行,然后把这个替换成:

#if defined(__GLIBC__) && !defined(__UCLIBC__) && !__GLIBC_PREREQ(2, 16)
_GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");
 #endif

然后再重新编译

make && make install

将安装目录下lib目录下的preloadable_libiconv.so拷贝到开发板/opt/Qtlib/qt-5.9.9/lib目录下

添加环境变量export LD_PRELOAD=/opt/Qtlib/qt-5.9.9/lib/preloadable_libiconv.so

 

至此,Qt已经移植完成了。

posted @ 2020-07-08 16:16  selflag  阅读(882)  评论(0)    收藏  举报