记录交叉编译OPENCV所遇到的坑

前言

目的在于给armlinux嵌入式平台程序编译一个可用的OPENCV库

坑!

坑1:依赖库自带相对路径

首先来说一个可能不那么好解决,且容易被各种教程误导的坑😅

当你按照网络上的教程进行交叉编译完成后,使用OPENCV库的程序也可以编译成功,但是却报一大堆所依赖的动态库找不到的警告,且此时往往将程序推送到armlinux机器里运行会直接崩溃掉,因为确实找不到依赖库

这个问题很大一个特征就是,所警告的动态链接库都会带上一个莫名其妙的相对路径!🙃

例如:../../lib/libopencv_core.so

或者可以通过shell中命令查看

readelf -d /home/OpenCV/opencv/arm_build/lib/libopencv_imgproc.so | grep NEEDED
0x00000001 (NEEDED) 共享库:[../../lib/libopencv_core.so]
0x00000001 (NEEDED) 共享库:[libstdc++.so.6]
0x00000001 (NEEDED) 共享库:[libgcc_s.so.1]
0x00000001 (NEEDED) 共享库:[libc.so]

属实是盖了帽了😅,因为属实是不应该带上这个莫名其妙的相对路径

正常的情况应该是如下这样

readelf -d /home/OpenCV/opencv/arm_build/lib/libopencv_imgproc.so | grep NEEDED
0x00000001 (NEEDED) 共享库:[libopencv_core.so]
0x00000001 (NEEDED) 共享库:[libstdc++.so.6]
0x00000001 (NEEDED) 共享库:[libgcc_s.so.1]
0x00000001 (NEEDED) 共享库:[libc.so]

(其实吧,如果真的带上了相对路径,也不是不能用

前提是你把opencv的动态链接库全部放到基于工程文件目录的../../lib文件夹里,也是可以的。此时编译后不会有警告

同时在将程序推送到armlinux机器里时,opencv库需要在基于程序所存放的目录的../../lib文件夹才可以正常运行,(那还真是盖了帽了😅

解决方式

恭喜你,你可能白编译了!😆

笔者亲身经历此坑,最终迫于无奈还是选择了重新编译,才解决这个问题

CMAKE中配置操作系统

懂了吗?答案就是此处必须要填写Linux

如上图所示,不可以为其他内容,否则make后将会导致动态链接库包含相对路径

同时这里也是在一开始的cmake-gui中配置CMakeSetup里的Target System-Operating System中填的内容

网上的教程可能让随便填,或者填什么ArmLinux,我信你个鬼你个糟老头子坏得很!🙃

你可能也看见了,这里可以重新改值。但是笔者亲测,修改后再点Configure,查看所出来的打印信息,里面显示的System仍然是刚开始配置的值,并没有改变,导致你以为改了,实际再次去cmake与make操作仍然会得到带有相对路径的动态链接库

最终笔者删除了整个build文件夹,重头再来😅

坑2:编译时报错找不到gtk相关库

.../ld: cannot find -lgtk-x11-2.0
.../ld: cannot find -lgdk-x11-2.0
.../ld: cannot find -lpangocairo-1.0
.../ld: cannot find -latk-1.0
.../ld: cannot find -lcairo
.../ld: cannot find -lgdk_pixbuf-2.0
.../ld: cannot find -lgio-2.0
.../ld: cannot find -lpangoft2-1.0
.../ld: cannot find -lpango-1.0
.../ld: cannot find -lgobject-2.0
.../ld: cannot find -lglib-2.0
.../ld: cannot find -lfontconfig
.../ld: cannot find -lfreetype
.../ld: cannot find -lgthread-2.0
collect2: error: ld returned 1 exit status

这个的原因很简单,其实就是笔者所使用的armlinux机器中的系统并不存在图形界面,自然在交叉编译器SDK里就不存在gtk图形库相关的内容,导致报错

既然机器自身的系统都不存在图形界面支持,那么opencv自然也不能用图形界面之类的功能了,笔者在需求上确实也没有与图形界面相关的内容

因此就可以直接选择关闭opencv的gtk相关支持

CMAKE中选择关闭GTK

把上图中小勾去掉就关闭了,去掉后重新点一下Configure和Generate,再执行make操作就可以了

坑3:找不到zconf.h文件

这个问题在于build文件夹中不存在zconf.h文件,但实际上源码目录里对应的目录是有zconf.h文件的,直接复制一份进去build中对应的目录就可以解决这个问题了

参考上面的cmake-gui截面图里面的源码路径和build构建路径

源码路径:/home/c/OpenCV/opencv

构建路径:/home/c/OpenCV/opencv/arm_build

就是构建路径中的3rdparty/xxxxx…不存在zconf.h文件,但是源码路径里的3rdparty/xxxxx…里可以找到这个文件,直接复制一份过去就好了(可以直接用文件搜索来找到

这个报错没有截图就这样啦~😆

其他常见的坑

1394

1394报错
CMAKE中选择关闭1394

关闭1394支持,硬件摄像头,一般情况用不到

#error “No suitable threading library available.”

添加#define HAVE_PTHREAD

多线程相关,没有相关宏定义导致直接报错,对应文件如图添加宏定义

#define HAVE_PTHREAD

其他坑笔者没遇到,需要你再自行搜索啦~

再不济可以尝试一下ChatGPT….😂