交叉编译opencv4移植到ARM

5 篇文章 1 订阅
4 篇文章 0 订阅


本文主要参考:https://blog.csdn.net/nila101/article/details/87367595

前言(逼逼叨)

opencv在我虚拟机中轻松的就编译成功了,顺利的装上了。但是交叉编译真的搞死我了,难就难在CMake配置上,搞了3天,第三天终于琢磨出来了。期间找过无数篇帖子和博客,各种千奇百怪的办法都有,按照他们的奇葩方法我试了n次,不知道他们用这奇葩方法是怎么成功的???写这篇博客主要作为记录,顺便回馈给广大网友,没有广大道友的博客和帖子,我也无法突破!
现在已经是晚上11:47分了,写完这个博客又得直接睡觉了,没时间消遣了。
在arm机上运行opencv拍下我帅气照片的那一刻,我开心地笑了~
2月初,正是2019-nCov爆发的时候,请各位保重!

环境

  • 宿主机:Ubuntu18.04 x86_64(虚拟机)
  • 目标机:nanoPi neo2
  • ARM芯片架构:aarch64
  • opencv版本:opencv 4.2.0
  • 交叉编译器:gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu
    交叉编译工具链下载地址:https://releases.linaro.org/components/toolchain/binaries/6.3-2017.05/aarch64-linux-gnu/

准备

1.系统环境准备

opencv中文文档:https://www.w3cschool.cn/opencv/opencv-123j28z4.html
使用终端运行以下命令

# 如果电脑上没有C/C++编译环境,执行:
sudo apt install build-essential
# 使64位系统兼容32位的库:
sudo apt install lib32ncurses5 lib32z1
# 安装相关工具
sudo apt install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
# 安装cmake-gui
sudo apt install cmake-qt-gui
# 下载opencv
mkdir nanopi_neo2 #建立一个目录
cd nanopi_neo2
git clone https://github.com/opencv/opencv.git

opencv可以选择版本下载

opencv GitHub地址:
https://github.com/opencv/opencv/releases

2.编译环境准备

2.1下载交叉编译工具:gcc、runtime、sysroot

交叉编译工具

2.2 下载后解压并合并

放在~/nanopi_neo2/gcc-linaro-6.3.1-2017.02-x86_64_aarch64-linux-gnu/目录下

xz -d gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu.tar.xz
xz -d runtime-gcc-linaro-6.3.1-2017.05-aarch64-linux-gnu.tar.xz
xz -d sysroot-glibc-linaro-2.23-2017.05-aarch64-linux-gnu.tar.xz
tar -xvf gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu.tar
tar -xvf runtime-gcc-linaro-6.3.1-2017.05-aarch64-linux-gnu.tar
tar -xvf sysroot-glibc-linaro-2.23-2017.05-aarch64-linux-gnu.tar
 最后将3个文件加内容合并
2.3 设置环境变量
sudo vim /etc/profile
在文件末尾加上这句:
export PATH=$PATH:/home/yourname/nanopi_neo2/gcc-linaro-6.3.1-2017.02-x86_64_aarch64-linux-gnu/bin
# 生效环境变量
source /etc/profile
# 重启[可选]
sudo reboot 

配置

# 进入opencv项目目录
cd ~/nanopi_neo2/opencv/
# 创建2个文件夹
mkdir -p build/install 
# 进入build目录
cd build
# 运行cmake-gui进行编译配置
cmake-gui

cmake-gui
①:opencv选择源码顶层目录
②:编译目录,存储编译时的中间文件,这里为我们刚才创建的build目录
③:配置好2个目录之后就点击configure按钮
configure
选择Specify toolchain file for cross-compiling(关键!关键!关键!)
网上99%的教程都让我选specify options for corss-compiling,根本行不通!!!
点击Next
select file
选择芯片架构文件
选择opencv/platforms/linux/aarch64-gnu.toolchain.cmake这个文件
aarch64是全志H5芯片的架构,请根据你自己的架构来选择
选择好之后点击Finish按钮
在这里插入图片描述
勾选BUILD_JPEG、BUILD_PNG
配置
CMAKE_BUILD_TYPE 输入Release

CMAKE_INSTALL_PREFIX 选择你想要安装的目录,这里是源码下刚才创建的install目录
配置
勾选Advanced
在CMAKE_EXE_LINKER_FLAGS栏填入-pthread -ldl -lrt
配置
单击Configure,接着单击Generate
关闭cmake-gui

编译

make

# 运行编译
# 虚拟机内存不够大的话别太贪心搞 make -j8
make -j4

我的机子是16G内存的,也不敢贪心搞make -j8,因内存不足编译会报错,毕竟是虚拟机.
机器开始疯狂的跑起来了!!!
编译完成
编译顺利完成,有图有真相!

make install

make install

很快就install好了
在install文件夹内产生了opencv的文件

移植

打包opencv

将~/nanopi_neo2/build/install/目录下的文件都打包

cd ~/nanopi_neo2/build/install/
tar -czvf opencv4_2.tar.gz ./*

产生的这个压缩包就是编译好的opencv了,保存好,省得下次再编!!

拷贝到arm

# 运行拷贝命令
scp ./opencv4_2.tar.gz root@192.168.1.6:/usr/local/arm/opencv4_2/

ARM端操作

opencv解压安装
# 进入目录
cd /usr/local/arm/opencv4_2/
# 解压
tar -xzvf opencv4_2.tar.gz
# 删除压缩包
rm opencv4_2.tar.gz
链接库文件
cd /etc/ld.so.conf.d
# 新建一个文件
touch opencv.conf
# 编辑文件
vim opencv.conf
# 添加如下内容:
/usr/local/arm/opencv4_2/lib
# 运行 使之生效
ldconfig

至此,OpenCV的移植完成!!!

可能产生的问题

libstdc++.so.6 not found

遇到如下错误

./cameraApp: /usr/lib/aarch64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.22' not found (required by /usr/local/arm/opencv4_2/lib/libopencv_gapi.so.4.2)

意思是导入库所需要的 libstdc++.so.6 没有找到,然后,我执行 locate libstdc++.so.6 命令,发现这个库是存在的啊。
上网查了一下发现原本是因为升级了 OpenCv 之后需要更高版本的库,而当前的版本过低,所以才出错。

# 执行这个命令看GLIBCXX版本
strings /usr/lib/aarch64-linux-gnu/libstdc++.so.6 | grep GLIBCXX

果然,显示的版本低于3.4.22 。
需要找一个更高版本的libstdc++.so.6: 使用locate命令来查查本地有没有:

# 在Ubuntu虚拟机中执行此命令
locate libstdc++.so.6

在交叉编译工具链里面有一个 libstdc++.so.6.0.22
注意:芯片架构需要吻合(看路径)

# 进目录
cd ~/nanopi_neo2/gcc-linaro-6.3.1-2017.02-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/lib64/
# 看版本
strings libstdc++.so.6.0.22 | grep GLIBCXX

在这里插入图片描述
查看它里面的GLIBCXX,发现正是我们需要的:3.4.22

解决方法:

首先把libstdc++.so.6.0.20 复制到 nanopi的库/usr/lib/aarch64-linux-gnu/文件夹下,然后删除原来的软链接 libstdc++.so.6,建立新的指向libstdc++.so.6.0.20的软链接;

# Ubuntu端操作
scp libstdc++.so.6.0.22 root@192.168.1.6:/usr/lib/aarch64-linux-gnu/
# arm端操作
# 查看软链接文件指向
ll |grep libstdc++.so.6 -h
# 删除软链接文件
rm libstdc++.so.6

原来的libstdc++.so.6,如下:

rwxrwxrwx  1 yinheyi yinheyi       19 7月  27 23:12 libstdc++.so.6 -> libstdc++.so.6.0.21

删除掉了原来的libstdc++.so.6,现在建立新的指向libstdc++.so.6.0.22的软链接:

# 重新软链接
ln -s libstdc++.so.6.0.22 libstdc++.so.6

再来看看现在的新的libstdc++.so.6,如下:

lrwxrwxrwx 1 root root       19 Feb  2 14:59 libstdc++.so.6 -> libstdc++.so.6.0.22*

问题解决!

  • 7
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值