1 Opencv 交叉编译
目的:将OpenCV移植到ARM板上
PC操作系统:VMWare虚拟机上安装的Ubuntu 22.04(x86_64)
OpenCV版本:4.7.0
交叉工具链:aarch64-linux-gnu,gcc version 9.3.0(这里重点说明:arm-linux-gnueabihf针对的是32位arm架构,aarch64-linux-gnu针对的是64位arm架构)
目标平台:arm板
1、安装交叉编译器
sudo apt-get install gcc-aarch64-linux-gnu
sudo apt-get install g++-aarch64-linux-gnu
2、安装和配置cmake-gui
sudo apt-get install cmake-gui #安装cmake-gui
sudo cmake-gui #启动cmake-gui对话框
sudo mkdir opencv/build #创建文件夹用于存放编译文件
sudo mkdir opencv/opencv_install #创建文件夹opencv_instal用于存放编译结果
弹出CMake配置对话框。填入opencv源代码目录和编译文件目录,点Configure.
选择交叉编译器:
点击Next:
注意:把c和c++路径换成自己的:/usr/bin/aarch64-linux-gnu-gcc,
c++:/usr/bin/aarch64-linux-gnu-g++;
Target Root输入:/usr/aarch64-linux-gnu/lib
4、点击Finish。
5、Search位置输入Z,把zip库(BUILD_ZLIB选项)选中(Ubuntu 20.04 不选择可能会报错)。
6、Search位置输入install(CMAKE_INSTALL_PREFIX选项),修改下opencv编译后存放的目录路径:这里随便选择一个空的目录即可。
7、点击Configure。
8、点击Generate。关闭对话框。
3、编译和安装OpenCV4
$ cd opencv/build #进入配置好的编译目录
$ sudo make -j8 #启动8个核一起编译 成功出现 [100%] Built target opencv_test_……
$ sudo make install #拷贝编译结果到opencv/opencv_install目录 成功出现 -- Set runtime path of "/home/wq/bin/opencv_version" to "/home/wq/lib"
4、可能会遇到的bug
(1)libpng recompler -lPIC
解决:在cmake-gui中打开advance选项,设置-fPIC,如下图。
设置完之后重新configure
2 搭建Qt5.14.交叉编译环境
本文硬件环境是ubuntu22.04 X86平台,但是编译出来的程序是在arm64架构上运行
一.安装QT5:
略
二.安装编译所需的组件
sudo apt install build-essential libgl1-mesa-dev gperf libclang-dev -y
#安装python环境(QT中的一些功能、组件需要用到)
sudo apt install python2 -y
sudo apt install python2-dev -y
sudo apt install python3 -y
sudo apt install python3-dev -y
sudo apt install python3-pip -y
#安装aarch64(arm64)编译链工具。国产CPU,如飞腾、华为麒麟等是这个架构(特别注意需要查看自己的系统位数,本人是X86_64)
sudo apt install g++-aarch64-linux-gnu -y
sudo apt install gcc-aarch64-linux-gnu -y
三.下载QT5源码
Index of /archive//qt5.14/5.14.2/single
注意:本人是解压到ubuntu22.04上,所以选择:qt-everywhere-src-5.14.2.tar.xz,window上下载zip文件
四.配置和编译源码
1 配置编译QT5的aarch64架构源码
进入刚才解压好的源码目录中,打开终端输入:
#配置编译参数
./configure -release -opensource -confirm-license -xplatform linux-aarch64-gnu-g++ -prefix /usr/local/qt5.14.2arm -nomake examples -no-opengl -silent -qpa linuxfb -skip qtquick3d -skip qtwayland -skip qtlocation -skip qtscript -no-sse2 -no-openssl -no-cups -no-glib -no-pkg-config -no-separate-debug-info -qt-libjpeg -qt-zlib -qt-libpng -skip qtvirtualkeyboard
其中:/usr/local/qt5.14.2arm 是编译后的安装目录,可自行修改
执行成功的话,如图:
2 编译:
make -j4
遇到编译不过的模块可以直接跳过。
遇到需要include的地方,在提示的文件添加对应的include。
将编译好的文件安装到指定位置(安装位置在前面配置参数时已设置):sudo make install
五、搭建 Qt Creator 交叉编译环境
安装完成后, 配置Qt Creator Kits。打开Qt,点击工具->选项
注意:本文安装的qmake路径:/usr/local/qt5.14.2arm/bin/qmake
配置 C++编译器:
注意替换成自己的g++编译路径,我的在:/usr/bin/aarch64-linux-gnu-g++;
配置 Kits,选择刚才的Qt versions5.1.4.2和C++编译器:
至此Qt交叉编译环境就搭建好了,可以新建一个项目试试,在新建项目时的Kits选项记得把刚才添加Kits也勾选上。
3 qt使用opencv
添加opencv头文件
INCLUDEPATH += /usr/local/include/
添加库文件
LIBS += -L/usr/lib/ -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs
4 linux下进行Qt打包发布
使用linuxdeployqt的原因:在arm板子上缺少编译的opencv_core.so这几个库,所以没办法运行QMENU2可执行程序,所以得把ubuntu22.04下面编译好的openvcv库全打包过去就可以了运行QMENU2。
1.下载linuxdeployqt
linuxdeployqt-x86_64.AppImage,下载地址:
Releases · probonopd/linuxdeployqt · GitHub
2. 安装linuxdeployqt
chmod 777 linuxdeployqt
再把这个可执行文件扔进/usr/local/bin目录,这样,我们就可以在其他目录访问了
mv linuxdeployqt /usr/local/bin
3 .打包程序
在编译完成的debug或者release目录下使用linuxdeployqt的打包命令,这里教程很多自行百度。
打包到arm后可以使用readelf -d appname的命令查看app的链接库路径。
这里就显示链接库应该放到$ORIGIN/lib下面
把opencv的库复制到这个lib下就可以运行了。
注意:linuxdeployqt开发者说要使用在最老的lts版本上,目前最老的好像是ubuntu14,所以之后的ubuntu版本都不能使用,解决办法是使用linuxdeployqt最老的版本,因为这个限制是在19年的某次更新添加的。
部分配图来源其他博客,此处做一个整合和新的踩坑的总结。