当前位置: 首页 > news >正文

编译opencv-3.4.5 [交叉编译]

在unbuntu20.04环境下编译opencv3.4.5,

cmake 版本:3.27.4

gcc 版本:11.4.0

g++版本:11.4.0

在此环境下编译opencv4.5.4正常。

1. 编译时遇到的问题

(1)

Built target libprotobuf
make: *** [Makefile:163:all] 错误 2

make时用suod:     sudo make -j4

(2)

[ 30%] Linking CXX static library ../../lib/libopencv_core.a
[ 30%] Built target opencv_core
make: *** [Makefile:166:all] 错误 2

解决方法: 通过联系不断的执行make命令

3.

make[2]: *** [3rdparty/openexr/CMakeFiles/IlmImf.dir/build.make:118:3rdparty/openexr/CMakeFiles/IlmImf.dir/IlmImf/ImfAcesFile.cpp.o] 错误 1
make[2]: *** [3rdparty/openexr/CMakeFiles/IlmImf.dir/build.make:146:3rdparty/openexr/CMakeFiles/IlmImf.dir/IlmImf/ImfB44Compressor.cpp.o] 错误 1
make[1]: *** [CMakeFiles/Makefile2:1797:3rdparty/openexr/CMakeFiles/IlmImf.dir/all] 错误 2

最后放弃在这个环境下编译这个opencv,因为考虑opencv3.4.5版本比较低,而这台电脑的cmake版本比较高,所以换了安装其他cmake低版本的电脑上编译。

2.换低版本cmake编译

vmware虚拟机上安装的ubuntu20上的环境为:

cmake版本为:3.16.3

gcc/g++:   9.4.0

3. 编译的opencv的.a库是基于x86的,因为并不是用交叉编译工具编译的。

参考:编译出错Relocations in generic ELF (EM: 62)_丁香树下丁香花开的博客-CSDN博客

编译成功了.a静态库, 但是把这些库添加进工程的编译配置后,又出现如下问题

通过objdump命令查看opencv的.a库文件格式,  很奇怪的是它是x86-64格式的

而同样的命令查看rk官方给的examples/3rdparty/opencv/opencv-linux-aarch64/中的库文件,发现格式是 elf64-little的,初步判断我编译的opencv库并不是用通过交叉编译得到的。

4.交叉编译工具编译opencv

opencv库可以直接在RK3566上进行编译,也可以选择在自己的Ubuntu上交叉编译opencv,然后在RK3566上调用编译好的库文件

参考:RK3588移植 opencv交叉编译_rk3588交叉编译opencv3.4.1_Bugger99的博客-CSDN博客

(1)下载交叉编译工具

这里下载: gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu

Downloads | GNU-A Downloads – Arm Developer

下载后把它解压到一个指定的路径之下。后续编译的时候可以直接引用路径下的文件即可。

另一种方式是通过命令行来安装交叉编译工具:


#不指定版本安装gcc和g++交叉编译工具 sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu

#指定安装最新的6.xx版本,应该是6.5.0,要安装中间小版本只能去下载编译器的压缩包 sudo apt install gcc-6-aarch64-linux-gnu g++-6-aarch64-linux-gnu

https://www.cnblogs.com/TaXueWuYun/p/15075015.html

(2)opencv下载

Releases - OpenCV

cd opencv-3.4.5

mkdir build  &&  cd  build

mkdir install

(3)安装好cmake, 我的cmake 版本是  3.16.3

(4)编译的gcc环境配置

>>  vim ~/.bashrc

>>在最后添加

export PATH="/home/ws/linux-gcc/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin:$PATH"

>>使环境变量生效 : source ~/.bashrc

>>验证gcc:  aarch64-none-linux-gnu-gcc  -v

(5) 编译

进入build路径下:

键入:

cmake  ../

-D CMAKE_BUILD_TYPE=RELEASE

-D CMAKE_INSTALL_PREFIX=/home/wm/Downloads/opencv-3.4.5/build/install     #安装路径,默认/usr/local

-D BUILD_SHARED_LIBS=OFF      #.a静态库

-D SOFTFP=ON          #aarch64结构???

-D CMAKE_CXX_COMPILER=aarch64-none-linux-gnu-g++             #交叉编译工具

-D CMAKE_C_COMPILER=aarch64-none-linux-gnu-gcc                 #交叉编译工具

-D CMAKE_SYSTEM_NAME=Linux                                            #目标系统名称

自己操作过程中,如果没有加最后一项,make到30%进度,即一直不能顺利进行,出现乱七八糟的各种问题。

加上后-D CMAKE_SYSTEM_NAME=Linux  ,有可能在make过程中产生类似如下的错误:

arm平台交叉编译opencv出现 undefined reference to `png_init_filter_functions_neon'

解决方法是:

找到3rdparty/libpng/CMakeLists.txt
在最上面加上

SET(ARM 1)
SET(ENABLE_NEON 1)

重新cmake  && make ,然后成功(make过程中可能断掉,但没提示错误,多重新make几次即可)

http://www.lryc.cn/news/174250.html

相关文章:

  • Canal 实现MySQL与Elasticsearch7数据同步
  • 网络安全攻防对抗之隐藏通信隧道技术整理
  • 读书笔记:多Transformer的双向编码器表示法(Bert)-2
  • Python 基于PyCharm断点调试
  • spring security auth2.0实现
  • MySQL(6)LOCK和MVCC
  • 最新IDE流行度最新排名(每月更新)
  • I2C的上拉电阻如何计算?
  • Centos下安装 oracle11g 博客2
  • 记一次逆向某医院挂号软件的经历
  • Canal实现Mysql数据同步至Redis、Elasticsearch
  • Kafka的消息传递保证和一致性
  • Docker 部署 Firefly III 服务
  • 配置OSPFv3基本功能 华为笔记
  • 【AI视野·今日Sound 声学论文速览 第九期】Thu, 21 Sep 2023
  • 数据结构-----堆(完全二叉树)
  • set/multiset容器、map容器
  • Linux系统编程——总结初识Linux(常用命令、特点、常见操作系统)
  • Js使用ffmpeg进行视频剪辑和画面截取
  • Linux基本命令,基础知识
  • 【Android知识笔记】进程通信(三)
  • 云上亚运:所使用的高新技术,你知道吗?
  • 数据结构简述,时间、空间复杂度,学习网站推荐
  • 在线安装qt5.15之后任意版本
  • 【kafka实战】01 3分钟在Linux上安装kafka
  • yum安装mysql8
  • 十五)Stable Diffusion使用教程:另一个线稿出3D例子
  • 2023icpc网络预选赛I. Pa?sWorD(dp)
  • maven本地安装jar包
  • QT中的inherits