QT在黑芝麻板子上的编译和运行

历经千辛万苦终于在黑芝麻板上成功运行了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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt是一款跨平台的应用程序开发框架,支持Windows、Linux、macOS等操作系统。Qt可以通过静态编译和动态编译两种方式进行构建和部署。 静态编译是指将Qt库的代码编译进最终生成的可执行文件中,这样生成的可执行文件独立性较强,不依赖于系统中是否安装了Qt库。静态编译的优点是可移植性好,部署简单,无需担心用户环境中是否已安装相应的Qt版本。然而,静态编译会使得可执行文件的大小变大,占用较多的存储空间,而且在更新Qt库时,需要重新编译整个应用程序。 动态编译是指将Qt编译为动态链接库(.so文件),在运行时需要通过动态链接库来加载并运行程序。动态编译产生的可执行文件较小,因为它只包含应用程序的逻辑代码,依赖于系统中已经安装的Qt库。动态编译的优点是减少了可执行文件的大小,节省存储空间,同时多个应用程序可以共享同一份Qt库,节省系统资源。然而,动态编译需要保证用户的系统中已经安装了相应版本的Qt库,否则会导致程序无法运行。 根据实际需求,我们可以选择静态编译或者动态编译。如果应用程序需要在不同的系统上运行,或者需要独立性较强、便于部署和维护,可以选择静态编译。如果应用程序需要节省存储空间,可以选择动态编译。需要注意的是,在选择编译方式时,应该考虑到预算、性能以及用户环境等因素。总的来说,Qt提供了灵活的编译方式,以满足不同应用场景的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值