zoukankan      html  css  js  c++  java
  • 嵌入式ARM之基于S5P6818平台移植Qt5.5、FFTW、QWT--图文教程

    @

    博客说明

    撰写日期 2019.09.25
    完稿日期 2019.09.28
    最近维护 暂无
    本文作者 multimicro
    联系方式 multimicro@qq.com
    资料链接 本文无附件资料
    GitHub https://github.com/wifialan/
    原文链接 https://blog.csdn.net/multimicro/article/details/101369585

    开发环境

    环境说明 详细信息 备注信息
    操作系统 Ubunut 16.04
    开发板 NanoPC-T3 - S5P6818 - Cortex A53 NanoPC-T3
    开发板系统 debian 32位(由友善之臂提供)
    Qt版本 qt-everywhere-opensource-src-5.5.1 官网地址
    FFTW版本 fftw-3.3.8 官网地址 | 下载地址
    QWT qwt-6.1.4 下载地址
    编译器版本 gcc-linaro-7.3.1-2018.05-x86_64_arm-linux-gnueabihf 官网地址
    编译器路径 /opt/toolschain/linaro/bin/arm-linux-gnueabihf- 绝对路径

    1. 移植Qt5.5

    移植Qt,本文分为三步:

    • 1 编写配置脚本文件,方便统一导入配置信息。更改目标平台下文件夹的qmake.conf内容,目的在于修改编译器路径
    • 2 执行上述配置脚本,会生成makefile文件,然后编译、a安装
    • 3 将编译安装后的文件拷贝到目标板,添加相应的环境变量

    1.1 编译Qt5.5

    1.1.1 增加配置脚本

    cd qt-everywhere-opensource-src-5.5.1
    

    在该文件夹下创建配置脚本文件 qtbuile.sh 文件内容如下

    #!/bin/sh
    ./configure -prefix /home/china/work/s5p6818/qt/Qt5.5 
    -verbose 
    -opensource 
    -release 
    -confirm-license 
    -xplatform linux-arm-gnueabi-g++ 
    -optimized-qmake 
    -shared 
    -no-opengl 
    -no-openssl 
    -no-sse2 
    -no-cups 
    -no-glib 
    -no-xcb
    

    对此配置文件有疑问的可以在该文件夹下执行./configure --help查看配置的详情解释
    这里提示三点:

    • -prefix 后面跟的是编译好的qt文件安装目录
    • xplatform指的是target端的版本
    • platform是PC端的
    -platform target ... The operating system and compiler you are building
                        on (default detected from host system).
    -xplatform target ... The target platform when cross-compiling.
    

    1.1.2 修改qmake.conf

    qmake.conf所在目录为qt-everywhere-opensource-src-5.5.1/qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf
    qmake.conf所在目录应和qtbuild.sh脚本里的xplatform指定目录一致
    修改内容如下,主要是指定修改编译器

    #
    # qmake configuration for building with arm-linux-gnueabi-g++
    #
    
    MAKEFILE_GENERATOR      = UNIX
    CONFIG                 += incremental
    QMAKE_INCREMENTAL_STYLE = sublib
    
    QT_QPA_DEFAULT_PLATFORM = linuxfb
    
    #Compiler Flags to take advantage of the ARM architecture
    #Run the linux terminal command "arch" to see the detail your target cpu arch information.
    #QMAKE_CFLAGS_RELEASE    += -O3 -march=armv7l
    #QMAKE_CXXFLAGS_RELEASE  += -O3 -march=armv7l
    
    include(../common/linux.conf)
    include(../common/gcc-base-unix.conf)
    include(../common/g++-unix.conf)
    
    # modifications to g++.conf
    QMAKE_CC                = /opt/toolschain/linaro/bin/arm-linux-gnueabihf-gcc
    QMAKE_CXX               = /opt/toolschain/linaro/bin/arm-linux-gnueabihf-g++
    QMAKE_LINK              = /opt/toolschain/linaro/bin/arm-linux-gnueabihf-g++
    QMAKE_LINK_SHLIB        = /opt/toolschain/linaro/bin/arm-linux-gnueabihf-g++
    
    # modifications to linux.conf
    QMAKE_AR                = /opt/toolschain/linaro/bin/arm-linux-gnueabihf-ar cqs
    QMAKE_OBJCOPY           = /opt/toolschain/linaro/bin/arm-linux-gnueabihf-objcopy
    QMAKE_NM                = /opt/toolschain/linaro/bin/arm-linux-gnueabihf-nm -P
    QMAKE_STRIP             = /opt/toolschain/linaro/bin/arm-linux-gnueabihf-strip
    load(qt_config)
    

    1.1.3 开始执行

    修改后执行

    ./qtbuild.sh
    

    没有错误的输出是这样的,若有错误,请通过查看error信息,更改。
    在这里插入图片描述
    然后

    make -j8
    make install
    

    最后的安装文件如下
    在这里插入图片描述

    1.2 移植库文件到开发板

    因为lib文件夹中有很多软链接,不可直接使用scp命令将其拷贝到开发板上,应将其压缩为一个包,然后使用scp或者u盘传到开发板,解压使用
    在这里插入图片描述
    压缩命令:

    tar -czvf qt5.5.tar.gz Qt5.5
    

    解压命令:

    tar -zxvf qt5.5.tar.gz
    

    开发板上效果
    在这里插入图片描述

    1.3 添加环境变量

    vim /etc/profile

    export QT_ROOT=/opt/qt5.5
    export LD_LIBRARY_PATH=/usr/lib:$QT_ROOT/lib                                          
    export QT_QPA_FONTDIR=$QT_ROOT/lib/fonts 
    export QT_PLUGIN_PATH=$QT_ROOT/plugins
    

    source /etc/profile

    2. 移植QWT

    windows下的编译方式参考QWT编译与配置-Windows/Linux环境

    下载源码后解压,然后进入qwt文件夹
    在这里插入图片描述

    2.1 PC端移植QWT

    2.1.1 编译步骤

    • 1.用目标Qt版本的qmake
    /opt/Qt5.12.1/5.12.1/gcc_64/bin/qmake qwt.pro
    
    • 2.编译
    make -j8
    

    若出现错误,请跟据错误情况禁用qwtconfig.pri文件中的相关组件

    • 3.安装(默认安装目录在root权限下,前面添加sudo)
    sudo make install
    
    • 4.默认编译好的qwt文件在:/usr/local/qwt-6.1.4

    2.1.2 PC端配置步骤

    • 1.添加qwt设计控件到qt里面
    sudo cp /usr/local/qwt-6.1.4/plugins/designer/libqwt_designer_plugin.so /opt/Qt5.12.1/Tools/QtCreator/lib/Qt/plugins/designer
    

    跟据Carlos Wei所列,qt中没有出现qwt控件,不知道为何,但我这个配置是可以的

    • 2.复制qwt所需要的库到qt里面
    sudo cp -r /usr/local/qwt-6.1.4/lib/* /opt/Qt5.12.1/5.12.1/gcc_64/lib/
    

    -r是因为要复制软链接文件
    在这里插入图片描述

    • 3.复制qwt所需要的头文件到qt里面
      在qt安裝路徑/Qt5.12.1/5.12.1/gcc_64/include 創建Qwt文件夾mkdir Qwt
    sudo cp /usr/local/qwt-6.1.4/include/* /opt/Qt5.12.1/5.12.1/gcc_64/include/Qwt
    

    配置成功后如下:
    在这里插入图片描述
    Qt中调用方式如下图所示,看LINUX下的可以
    在这里插入图片描述在这里插入图片描述
    头文件包含是节选,选择性调用即可。

    2.2 ARM端移植QWT

    2.2.1 编译步骤

    • 1.更改QWT安装位置(此步骤更改为非root权限下文件夹,可选步骤)
    gedit qwtconfig.pri
    

    修改前:

    unix {
        QWT_INSTALL_PREFIX    = /usr/local/qwt-$$QWT_VERSION
        # QWT_INSTALL_PREFIX = /usr/local/qwt-$$QWT_VERSION-qt-$$QT_VERSION
    }
    

    修改后:

    unix {
        QWT_INSTALL_PREFIX    = /home/china/work/s5p6818/module/qwt_install/qwt-$$QWT_VERSION
        # QWT_INSTALL_PREFIX = /usr/local/qwt-$$QWT_VERSION-qt-$$QT_VERSION
    }
    
    • 2.使用编译好的可构建在ARM端工程的qmake,也就是编译arm端qt的qmake进行构建
    /home/china/work/s5p6818/qt/Qt5.5/bin/qmake qwt.pro
    
    • 3.编译
    make -j8
    

    若出现错误,请跟据错误情况禁用qwtconfig.pri文件中的相关组件
    如:
    cd src/ && ( test -e Makefile || /home/china/work/s5p6818/qt/Qt5.5/bin/qmake /home/china/work/s5p6818/module/qwt-6.1.4/src/src.pro -o Makefile ) && make -f Makefile
    Project ERROR: Unknown module(s) in QT: opengl
    Makefile:45: recipe for target 'sub-src-make_first-ordered' failed
    make: *** [sub-src-make_first-ordered] Error 3

    则修改qwtconfig.pri文件中此处位置:
    ######################################################################
    # If you want to use a OpenGL plot canvas
    ######################################################################

    #QWT_CONFIG += QwtOpenGL


    • 4.安装
    make install
    
    • 5.编译好的qwt文件在:/home/china/work/s5p6818/module/qwt_install/

    2.2.2 ARM端配置方法

    拷贝lib目录下文件到ARM板下面的qt中lib文件夹中
    tips:因为有软链接,可以先把这些打包压缩,然后传输到板子上,解压即可,可以保证软接不被破坏
    在这里插入图片描述

    3. 移植FFTW

    windows下参考Qt上FFTW組件的編譯安裝

    进入fftw文件夹目录
    在这里插入图片描述

    3.1 PC端

    • 1.配置
    ./configure --prefix=/usr/local/fftw --enable-float --disable-fortran  --enable-shared=yes
    
    • 2.编译
    make -j8
    
    • 3.安装
    sudo make install
    

    3.2 ARM端

    • 1.配置,此处我更改了fftw的安装目录和编译器
    ./configure --prefix=/home/china/work/s5p6818/module/fftw_install --host=arm-linux --enable-float --disable-fortran  --enable-shared=yes CC=/opt/toolschain/linaro/bin/arm-linux-gnueabihf-gcc
    

    Tips:
    --prefix=/home/china/work/s5p6818/module/fftw_install指定安装文件所在位置
    --host=arm-linux指定目标处理器为arm
    CC=/opt/toolschain/linaro/bin/arm-linux-gnueabihf-gcc指定交叉编译器

    • 2.编译
    make -j8
    
    • 3.安装
    make install
    

    3.3 QT软件中的调用方式

    在qt工程的.pro文件中添加(仅看关于FFTW的):
    PC端的路径和ARM端路径不同,这里为了区分而已

    #LINUX_QWT_DIR=/usr/local/qwt-6.1.4  //(PC端)
    #LINUX_FFTW_DIR=/usr/local/fftw
    LINUX_QWT_DIR=/home/china/work/s5p6818/module/qwt_install/qwt-6.1.4 //(ARM端)
    LINUX_FFTW_DIR=/home/china/work/s5p6818/module/fftw_install
    
    WIN_QWT_DIR=C:optqwtqwt-6.1.4
    WIN_FFTW_DIR=C:optfftw
    # add file: qwt.dll file: libfftw3f-3.dll to *.exe path
    
    unix {
        INCLUDEPATH += $${LINUX_QWT_DIR}/include
        INCLUDEPATH += $${LINUX_FFTW_DIR}/include
        LIBS += -L"$${LINUX_QWT_DIR}/lib/" -lqwt
        LIBS += $${LINUX_FFTW_DIR}/lib/libfftw3f.a
    }
    
    win32 {
        INCLUDEPATH += $${WIN_QWT_DIR}include
        INCLUDEPATH += $${WIN_FFTW_DIR}
        LIBS += -L"$${WIN_QWT_DIR}lib" -lqwt
        LIBS += "$${WIN_FFTW_DIR}libfftw3f-3.dll"
    }
    

    3.4 ARM开发板

    在这里插入图片描述

    4. 测试

    4.1 编译Qt源码

    桌面端Qt的配置参考JZ2440(V3)移植QT5.6--图文教程
    然后将编译后的可执行文件传到arm开发板上执行测试,通过file命令可查看可执行文件信息
    在这里插入图片描述

    4.2 测试图片

    确保环境变量加载到当前shell里面后,通过一下命令可以看到程序的在ARM开发板上的运行情况

    sudo ./NetworkPlot
    

    字体暂时没有移植,固软件上面的按钮上没有显示,可以看出,在嵌入式ARM板子上,可以完美运行
    在这里插入图片描述

    5 问题汇总

    • 1)libstdc++.so.6: version `CXXABI_1.3.9' not found
      解决办法:
      找到PC端的交叉编译器里面的libstdc++.so.6所指向的实体文件
      在这里插入图片描述然后将该文件传到开发板上,并在开发板上马重新给libstdc++.so.6建立软链接,具体参考 此篇文章
      在这里插入图片描述
    • 2)执行嵌入式qt程序后,停止嵌入式系统的可视化显示
      本章用的debian系统里面的屏幕显示进程为lightdm
      通过采用以下命令可以查看进程号
    ps aux | grep lightdm
    

    在这里插入图片描述选择/usr/bin/X :0 -seat seat0 -auth /var/run/lightdm/root/:0这条进程的进程号491,然后
    暂停进程
    kill -STOP 491
    继续进程
    kill -CONT 491


    可以在shell里面,用一句命令实现

    ps -ef | grep "/usr/bin/X :0 -seat seat0 -auth /var/run/lightdm/root/:0" | grep -v grep | awk '{print $2}' | xargs kill -STOP -9
    

    也可以用脚本实现

    #! /bin/sh  
    ID=`ps -ef | grep '/usr/bin/X :0 -seat seat0 -auth /var/run/lightdm/root/:0' | grep -v 'grep' | awk '{print $2}'`  
    for pid in $ID  
    do  
        kill -STOP -9 $pid  
        echo " kill multimirco pid:$pid"  
    done
    

    Tips:
    ps -ef : 查看进程
    grep ‘multimirco’ 列出进程multimirco的信息
    grep -v 'grep' 忽略包含grep的进程
    awk '{print $2}'输出第二列的数据
    xargs kill -STOP -9暂停输入的进程

    参考资料

    1. JZ2440(V3)移植QT5.6--图文教程
    2. Linux编译移植Qt5的环境_OMAPL138平台
    3. 移植qt5.5
    4. 移植QT5.7.0到64位fireflyPK3399开发板
    5. Qt上FFTW組件的編譯安裝
    6. QWT编译与配置-Windows/Linux环境
    7. qwt6.1.0编译与安装
    8. Qwt移植到S3C6410
    9. QT编程之FFTW——Linux操作系统
    10. This application failed to start because it could not find or load the Qt platform plugin "linuxfb"
    11. linux暂停一个在运行中的进程
    12. 升级gcc后出现错误:/usr/lib/libstdc++.so.6: version `CXXABI_1.3.9' not found
    13. 如何查找SHELL的进程号并杀死
  • 相关阅读:
    Python: Best Way to Exchange Keys with Values in a Dictionary?
    install pymssql on centos
    centos 5.5 deploy full procedure
    centos 5.5 deploy full procedure
    change defaut python to 2.6.5 on centos
    Python: Best Way to Exchange Keys with Values in a Dictionary?
    install eventlet ,redis,dreque on centos
    install freetds on centos
    use alias
    install eventlet ,redis,dreque on centos
  • 原文地址:https://www.cnblogs.com/multimicro/p/11604799.html
Copyright © 2011-2022 走看看