嵌入式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
暂停输入的进程
参考资料
- JZ2440(V3)移植QT5.6--图文教程
- Linux编译移植Qt5的环境_OMAPL138平台
- 移植qt5.5
- 移植QT5.7.0到64位fireflyPK3399开发板
- Qt上FFTW組件的編譯安裝
- QWT编译与配置-Windows/Linux环境
- qwt6.1.0编译与安装
- Qwt移植到S3C6410
- QT编程之FFTW——Linux操作系统
- This application failed to start because it could not find or load the Qt platform plugin "linuxfb"
- linux暂停一个在运行中的进程
- 升级gcc后出现错误:/usr/lib/libstdc++.so.6: version `CXXABI_1.3.9' not found
- 如何查找SHELL的进程号并杀死