历经千辛万苦终于在黑芝麻板上成功运行了QT程序,现在将经验总结下来
1 第一阶段交叉编译QT
1.1 下载qt-everywhere-src-5.14.2.tar.xz(必须是XZ压缩包)并解压(可以用国内镜像http://mirrors.ustc.edu.cn/qtproject/)
1.2 安装和查看交叉编译工具
我们使用的交叉编译工具是:黑芝麻docker中的aarch64-bst-linux-g++(路径 :/opt/bstos/1.2.0.3/sysroots/x86_64-bstsdk-linux/usr/bin/aarch64-bst-linux/aarch64-bst-linux-g++)
通过下面命令查看aarch64-bst-linux-g++编译工具是否安装成功
aarch64-bst-linux-g++ -v
1.3 设置编译选项,编辑文件
qt-everywhere-src-5.14.2\qtbase\mkspecs\linux-aarch64-gnu-g++\qmake.conf,修改成如下配置:
# modifications to g++.conf
QMAKE_CC = aarch64-bst-linux-gcc --sysroot=/opt/bstos/1.2.0.3/sysroots/aarch64-bst-linux
QMAKE_CXX = aarch64-bst-linux-g++ --sysroot=/opt/bstos/1.2.0.3/sysroots/aarch64-bst-linux
QMAKE_LINK = aarch64-bst-linux-g++ --sysroot=/opt/bstos/1.2.0.3/sysroots/aarch64-bst-linux
QMAKE_LINK_SHLIB = aarch64-bst-linux-g++ --sysroot=/opt/bstos/1.2.0.3/sysroots/aarch64-bst-linux
# modifications to linux.conf
QMAKE_AR = aarch64-bst-linux-ar cqs
QMAKE_OBJCOPY = aarch64-bst-linux-objcopy
QMAKE_NM = aarch64-bst-linux-nm -P
QMAKE_STRIP = aarch64-bst-linux-strip
注:aarch64-bst-linux-g++是黑芝麻的交叉编译工具,--sysroot=/opt/bstos/1.2.0.3/sysroots/aarch64-bst-linux是黑芝麻的编译项
1.4 在黑芝麻docker中进入qt-everywhere-src-5.14.2目录下执行命令:
./configure -prefix /usr/local/arm_qt-5.14.2-release -extprefix /home/yangkm/Tools/qt5.14.2 -xplatform linux-aarch64-gnu-g++ -release -strip -confirm-license -no-opengl -no-pch -shared -no-xcb -no-eglfs -nomake examples -qt-zlib -linuxfb -feature-library -skip qtdeclarative
-extprefix :指定安装路径,
-xplatform :使用哪个目录下的文件编译,就是1.3中的目录
-release:编成release版本
-shared:生成动态库
1.5 配置完成后执行 make -j2 ,选择版本时输入 o
o表示编成开源版本库
1.6 编译完成后执行 make install 命令
1.7 QT库就安装在/home/yangkm/Tools/qt5.14.2/目录下
1.8 设置QT的环境变量,也可以把下面命令放在/etc/profile文件中工具是否安装成功
export ARMQTDIR=/home/yangkm/Tools/qt5.14.2
export PATH=$ARMQTDIR/bin:$PATH
export MANPATH=$ARMQTDIR/man:$MANPATH
export LD_LIBRARY_PATH=$ARMQTDIR/lib:$LD_LIBRARY_PATH
1.9 测试 ARM 版 QT 是否安装并配置成功,输入qmake –v就会显示qmake的版本信息,如下:
2 第二阶段编译QT程序
2.1 开发板连接上显示器
2.2 将QT的库qt5.14.2拷贝到docker的/home/yangkm/Tools目录
2.3 在windows下创建一个简单的QT项目hello,将其拷贝到黑芝麻docker目录下
2.4 Docker环境中hello目录下,执行命令/home/yangkm/Tools/qt5.14.2/bin/qmake -o Makefile hello.pro生成Makefile
2.5 Docker环境中执行命令make,生成目标文件 hello
3 第三阶段开发板子上运行QT程序
3.1 将目标文件 hello拷贝到开发板的/opt/vision_sdk目录下
3.2将第一阶段生成的QT安装库/home/yangkm/Tools/qt5.14.2拷贝到开发板的/opt/vision_sdk/project/目录下。
(可以只拷贝qt5.14.2下的lib和plugins两个目录,其它目录用不到)
3.3 开发板上编辑/etc/profile,添加环境变量:
export QTDIR=/opt/vision_sdk/project/qt5.14.2
export PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
export QT_PLUGIN_PATH=$QTDIR/plugins:$QT_PLUGIN_PATH
export QT_QPA_PLATFORM_PLUGIN_PATH=$QTDIR/plugins/platforms
export QT_QPA_FONTDIR=$QTDIR/lib/fonts
export QT_QPA_FB_TSLIB=1
export QT_QPA_GENERIC_PLUGINS=tslib:/dev/input/event2
export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0:size=1024x600:mmSize=1024x600:offset=0x0:tty=/dev/tty1执行命令sorce /etc/profile
3.4 执行命令 chmod 777 hello
3.5 执行命令 ./hello --platform linuxfb,输出如下:
Hello,This is QT test! !
4 视频回放的移植
4.1 工控机上的player目录拷贝到B01的workspace/algo/目录下
4.2 将player代码的引用到的头文件拷贝到该目录下,如event和mcuipc
4.3 执行命令qmake –project生成项目文件player.pro
4.4 在player.pro添加QT += core gui widgets
4.5 执行命令qmake -o Makefile player.pro生成Makefile
4.6 在Makefile中INCPATH变量结尾添加-Ibaseclasses -Ievent -Imcuipc –Icommon
4.7 执行命令make编译
5 后记
细心的童鞋可以会发现hello项目中的main.cpp文件中没有任何控件和窗口的代码,仅仅输出了一行log,这是因为黑芝麻开发板没有framebuffer驱动,当然也不会有/dev/fb0设备,包含窗口的代码在运行时会输出错误:
root@a1000:/opt/vision_sdk# ./hello
Failed to open framebuffer /dev/fb0 (No such file or directory)
linuxfb: Failed to initialize screen
No such plugin for spec "tslib:/dev/input/event2"
no screens available, assuming 24-bit color
Cannot create window: no screens available
Aborted
当前内核不支持framebuffer,内核需要重新编译,编译之前make menuconfig勾选framebuffer
6 注意事项
6.1 QT的安装包一定要下载tar.xz包,不要下载zip包,不然编译时候会出许多麻烦
6.2 一定要使用黑芝麻docker中的aarch64-bst-linux-g++工具编译,不要使用B01代码中的project/tool_chain/gcc-linaro-5.3-2016.02-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++,虽然它编译的文件也能在开发板上运行,但是它编成的库出现不兼容问题
6.3 黑芝麻的编译选项要加上:--sysroot=/opt/bstos/1.2.0.3/sysroots/aarch64-bst-linux
6.4 1.4中的编译命令不可以随意改变,不同的选项对应不同的操作
6.5 不要忘记设置QT_QPA_PLATFORM_PLUGIN_PATH