【已解决】Ubuntu 20.04 编译OpenCV 动态链接库指向版本不一致导致出错

文章讲述了在编译OpenCV4.8.1时遇到的undefinedreference错误,由于系统和Anaconda的动态链接库版本不一致导致。解决方法是找到并确保libffi库的正确版本指向,通过ldd命令进行检查和修复。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:编译OpenCV 4.8.1, 显示出错:

/usr/bin/ld: /lib/x86_64-linux-gnu/libwayland-client.so.0: undefined reference to `ffi_type_uint32@LIBFFI_BASE_7.0'
/usr/bin/ld: /lib/x86_64-linux-gnu/libwayland-client.so.0: undefined reference to `ffi_type_sint32@LIBFFI_BASE_7.0'
/usr/bin/ld: /lib/x86_64-linux-gnu/libwayland-client.so.0: undefined reference to `ffi_type_pointer@LIBFFI_BASE_7.0'
/usr/bin/ld: /lib/x86_64-linux-gnu/libwayland-client.so.0: undefined reference to `ffi_type_void@LIBFFI_BASE_7.0'
/usr/bin/ld: /lib/x86_64-linux-gnu/libwayland-client.so.0: undefined reference to `ffi_prep_cif@LIBFFI_BASE_7.0'
/usr/bin/ld: /lib/x86_64-linux-gnu/libwayland-client.so.0: undefined reference to `ffi_call@LIBFFI_BASE_7.0'
collect2: error: ld returned 1 exit status
make[2]: *** [apps/annotation/CMakeFiles/opencv_annotation.dir/build.make:104:bin/opencv_annotation] 错误 1
make[1]: *** [CMakeFiles/Makefile2:3208:apps/annotation/CMakeFiles/opencv_annotation.dir/all] 错误 2
make[1]: *** 正在等待未完成的任务....

问题分析:系统的动态链接库和Anaconda的动态链接库指向的版本不同,因此编译出错。

解决方法:先下载一个工具包locate。比find好用。

$ sudo apt install locate
$ sudo updatedb

然后用内置命令ldd查看出现问题的libwayland-client.so.0当中,所依赖的ffi这个库的叫什么。

$ ldd /lib/x86_64-linux-gnu/libwayland-client.so.0 | grep ffi

我们可以发现依赖的这个库叫做libffi.so.7。

之后locate这个文件,发现除了/usr/lib/x86_64-linux-gnu之外,我的Anaconda安装目录/lib下面也有一个libffi.so.7。输入以下命令分别查看两个libffi.so.7链接的动态库文件:

# 查看系统的libffi
$ ll /lib/x86_64-linux-gnu/ | grep ffi
# 查看Anaconda的libffi
$ ll ~/anaconda3/lib/ | grep ffi

结果显示系统的libffi.so.7指向了7.1.0版本,而Anaconda下的指向了8.1.2版本。

因此,把anaconda下的libffi.so.7指向系统的7.1.0就可以了。

$ cd (你的Anaconda安装目录)/lib
$ sudo rm libffi.so.7
$ sudo ln -s /lib/x86_64-linux-gnu/libffi.so.7.1.0 libffi.so.7

再次查看Anaconda下的ffi,发现libffi.so.7已经指向了lib/x86_64-linux-gnu/libffi.so.7.1.0。

再次编译OpenCV,通过。

总结:当编译程序的时候,如果安装了Anaconda,经常会出现动态链接库的依赖指向问题。保证系统和Anaconda的依赖库版本一致,可以避免一些Bug。

ldd这个命令常用来打印或者查看程序运行所需的共享库(访问共享对象依赖关系),可以解决程序因缺少某个库文件而不能运行的一些问题。

参考:【已解决】/lib/x86_64-linux-gnu/libapr-1.so.0: undefined reference to `uuid_generate@UUID_1.0`

### 如何在 Ubuntu 20.04 上从源代码编译 OpenCV #### 准备工作 为了成功编译 OpenCV,需要确保系统已安装必要的依赖项。可以通过以下命令来更新包管理器并安装所需的工具和库: ```bash sudo apt update && sudo apt upgrade sudo apt install build-essential cmake git pkg-config libgtk-3-dev \ libavcodec-dev libavformat-dev libswscale-dev libv4l-dev \ libjpeg-dev libpng-dev libtiff-dev gfortran openexr libatlas-base-dev \ python3-dev python3-numpy libtbb2 libtbb-dev libdc1394-22-dev ``` 这些依赖项涵盖了 C/C++ 开发环境、图像处理库以及 Python 支持。 --- #### 下载 OpenCVopencv_contrib 源码 可以从官方 GitHub 存储库下载最新版本OpenCV 及其扩展模块 `opencv_contrib` 的源代码。以下是具体操作步骤: ```bash cd ~ git clone https://github.com/opencv/opencv.git git clone https://github.com/opencv/opencv_contrib.git cd ~/opencv git checkout 4.5.3 # 替换为你希望使用的特定版本号 cd ~/opencv_contrib git checkout 4.5.3 # 版本应与 opencv 主仓库保持一致 ``` 上述命令会克隆指定版本OpenCV 和附加功能模块到本地机器上[^1]。 --- #### 创建构建目录并配置 CMake 创建一个新的目录用于存储生成的二进制文件和其他中间产物,避免污染原始源代码树结构: ```bash cd ~/opencv mkdir build cd build cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=/usr/local \ -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules \ -D ENABLE_CXX11=ON .. ``` 这里的关键参数解释如下: - `-D CMAKE_BUILD_TYPE=RELEASE`: 设置为发布模式以优化性能。 - `-D CMAKE_INSTALL_PREFIX=/usr/local`: 定义目标安装路径,默认情况下 `/usr/local` 是推荐位置。 - `-D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules`: 启用额外的功能模块支持。 - `-D ENABLE_CXX11=ON`: 如果项目需要用到现代标准特性,则启用此选项[^2]。 完成以上设置后执行 `cmake ..` 将解析所有依赖关系,并生成 Makefile 文件供后续使用。 --- #### 执行编译过程 一旦 CMake 配置完毕就可以正式开始编译流程了: ```bash make -j$(nproc) ``` 该指令利用多核 CPU 并行加速整个构建进程;其中 `$(nproc)` 自动检测当前主机可用的核心数从而最大化效率。等待一段时间之后如果没有任何错误提示即表示顺利完成初步组装阶段[^3]。 接着验证一下刚刚制作出来的可执行程序是否正常运作: ```bash ./bin/opencv_version ``` 它应该返回所选版本号比如这里是 **4.5.3**。 最后一步就是把成果部署至全局环境中去方便日后调用: ```bash sudo make install sudo ldconfig ``` 至此已经完成了全部的手工定制化装配作业! --- #### 动态链接库的应用实例 假设我们有一个简单的 C++ 测试案例想要连接刚才自制好的 OpenCV 库来进行图形显示等功能演示的话,那么就需要按照下面的方式编写相应的 CMakelists 或者直接写好 Makefile 来简化重复劳动强度较高的手动调整环节。 对于采用 CMake 方法的情况来说只需要遵循之前提到过的模板稍作修改即可满足需求。 而对于传统型 Makefile 方案则更加灵活自由一些但相对复杂度也会有所提升因此建议初学者优先考虑前者作为入门途径之一。 ---
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值