嵌入式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:\opt\qwt\qwt-6.1.4
WIN_FFTW_DIR=C:\opt\fftw
# 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的进程号并杀死
posted @ 2019-09-28 20:52  multimicro  阅读(2484)  评论(0编辑  收藏  举报