/usr/bin/ld: /usr/lib/x86_64-linux-gnu/libwayland-client.so.0: undefined reference to `ffi_type_uint

解决Ubuntu下OpenCV编译错误

0.系统环境

  • Ubuntu20.04
  • ROS2 foxy
  • Anaconda
  • OpenCV 4.5

1.问题描述

 Ubuntu20下,编译OpenCV 4.5 源码时,报错如下:

/usr/bin/ld: /usr/lib/x86_64-linux-gnu/libwayland-client.so.0: undefined reference to `ffi_type_uint32@LIBFFI_BASE_7.0'
/usr/bin/ld: /usr/lib/x86_64-linux-gnu/libwayland-client.so.0: undefined reference to `ffi_type_sint32@LIBFFI_BASE_7.0'
/usr/bin/ld: /usr/lib/x86_64-linux-gnu/libwayland-client.so.0: undefined reference to `ffi_type_pointer@LIBFFI_BASE_7.0'
/usr/bin/ld: /usr/lib/x86_64-linux-gnu/libwayland-client.so.0: undefined reference to `ffi_type_void@LIBFFI_BASE_7.0'
/usr/bin/ld: /usr/lib/x86_64-linux-gnu/libwayland-client.so.0: undefined reference to `ffi_prep_cif@LIBFFI_BASE_7.0'
/usr/bin/ld: /usr/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]: *** [modules/core/CMakeFiles/opencv_test_core.dir/build.make:841: bin/opencv_test_core] Error 1
make[1]: *** [CMakeFiles/Makefile2:3615: modules/core/CMakeFiles/opencv_test_core.dir/all] Error 2
make: *** [Makefile:166: all] Error 2

 2. 问题分析

使用辅助工具 locate,locate安装方法如下:

sudo apt install locate
sudo updatedb

locate命令用于搜索和定位文件,且相比find命令搜索速度更快,同时也支持在搜索文件时使用正则表达式。

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

用内置命令ldd查看libwayland-client.so.0,所依赖的ffi这个库的叫什么。

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

运行结果是:libffi.so.7 => /opt/ros/foxy/lib/libffi.so.7 (0x00007f18e183d000)

  locate :

locate libffi.so.7

 结果显示,anaconda下,ros下,Ubuntu系统下,均有libffi.so.7.

使用 ll 命令分别查看libffi.so.7链接的动态库文件:

# 查看系统的libffi

$ ll /lib/x86_64-linux-gnu/ | grep ffi


# 查看Anaconda的libffi

$ ll ~/anaconda3/lib/ | grep ffi


# 查看 ROS 的libffi

$ ll /opt/ros/foxy/lib/ | grep ffi

3 问题解决

关于调用顺序:

链接器会使用 LD_LIBRARY_PATH 中最先找到的 libffi.so.7。如果你没有设置 LD_LIBRARY_PATH,那么它会使用系统的默认库路径,通常是 /usr/lib/usr/local/lib

如果你想确保使用特定版本的 libffi,你可以将该版本的路径添加到 LD_LIBRARY_PATH 的前面,或者在编译 OpenCV 之前设置 LD_LIBRARY_PATH 环境变量。

但是笔者调整~/.bashrc文件中的 LD_LIBRARY_PATH 变量,也尝试在编译OpenCV之前运行如下命令

export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu/:$LD_LIBRARY_PATH

笔者系统中使用的anaconda中的libffi.so.7,修改anaconda 的libffi.so.7 指向系统libffi.so.7:

cd ~/anaconda3//lib

sudo rm libffi.so.7
sudo ln -s /lib/x86_64-linux-gnu/libffi.so.7.1.0 libffi.so.7

编译OpenCV源码通过。

参考文章:

https://blog.youkuaiyun.com/FRIGIDWINTER/article/details/129685867

ubuntu undefined reference to 问题解决方法-优快云博客

/usr/bin/ld: warning: libIlmImf-2_3.so.24, needed by ../third_party/opencv3/lib64/libopencv_imgcodecs.so.3.4.7, not found (try using -rpath or -rpath-link) /usr/bin/ld: ../third_party/opencv3/lib64/libopencv_imgcodecs.so.3.4.7: undefined reference to `Imf_2_3::InputFile::InputFile(char const*, int)' /usr/bin/ld: ../third_party/opencv3/lib64/libopencv_imgcodecs.so.3.4.7: undefined reference to `Imf_2_3::OutputFile::setFrameBuffer(Imf_2_3::FrameBuffer const&)' /usr/bin/ld: ../third_party/opencv3/lib64/libopencv_imgcodecs.so.3.4.7: undefined reference to `Imf_2_3::FrameBuffer::insert(char const*, Imf_2_3::Slice const&)' /usr/bin/ld: ../third_party/opencv3/lib64/libopencv_imgcodecs.so.3.4.7: undefined reference to `Imf_2_3::Header::channels()' /usr/bin/ld: ../third_party/opencv3/lib64/libopencv_imgcodecs.so.3.4.7: undefined reference to `Imf_2_3::chromaticities(Imf_2_3::Header const&)' /usr/bin/ld: ../third_party/opencv3/lib64/libopencv_imgcodecs.so.3.4.7: undefined reference to `Imf_2_3::OutputFile::OutputFile(char const*, Imf_2_3::Header const&, int)' /usr/bin/ld: ../third_party/opencv3/lib64/libopencv_imgcodecs.so.3.4.7: undefined reference to `Imf_2_3::FrameBuffer::begin()' /usr/bin/ld: ../third_party/opencv3/lib64/libopencv_imgcodecs.so.3.4.7: undefined reference to `Imf_2_3::Header::Header(int, int, float, Imath_2_3::Vec2<float> const&, float, Imf_2_3::LineOrder, Imf_2_3::Compression)' /usr/bin/ld: ../third_party/opencv3/lib64/libopencv_imgcodecs.so.3.4.7: undefined reference to `Imf_2_3::Channel::Channel(Imf_2_3::PixelType, int, int, bool)' /usr/bin/ld: ../third_party/opencv3/lib64/libopencv_imgcodecs.so.3.4.7: undefined reference to `Imf_2_3::Header::channels() const' /usr/bin/ld: ../third_party/opencv3/lib64/libopencv_imgcodecs.so.3.4.7: undefined reference to `Imf_2_3::InputFile::setFrameBuffer(Imf_2_3::FrameBuffer const&)' /usr/bin/ld: ../third_party/opencv3/lib64/libopencv_imgcodecs.so.3.4.7: undefined reference to `Imf_2_3::FrameBuffer::end()' /usr/bin/ld: ../third_party/opencv3/lib64/libopencv_imgcodecs.so.3.4.7: undefined reference to `Imf_2_3::InputFile::header() const' /usr/bin/ld: ../third_party/opencv3/lib64/libopencv_imgcodecs.so.3.4.7: undefined reference to `Imf_2_3::Header::~Header()' /usr/bin/ld: ../third_party/opencv3/lib64/libopencv_imgcodecs.so.3.4.7: undefined reference to `Imf_2_3::InputFile::readPixels(int, int)' /usr/bin/ld: ../third_party/opencv3/lib64/libopencv_imgcodecs.so.3.4.7: undefined reference to `Imf_2_3::globalThreadCount()' /usr/bin/ld: ../third_party/opencv3/lib64/libopencv_imgcodecs.so.3.4.7: undefined reference to `Imf_2_3::Header::dataWindow() const' /usr/bin/ld: ../third_party/opencv3/lib64/libopencv_imgcodecs.so.3.4.7: undefined reference to `Imf_2_3::ChannelList::findChannel(char const*) const' /usr/bin/ld: ../third_party/opencv3/lib64/libopencv_imgcodecs.so.3.4.7: undefined reference to `Imf_2_3::OutputFile::~OutputFile()' /usr/bin/ld: ../third_party/opencv3/lib64/libopencv_imgcodecs.so.3.4.7: undefined reference to `Imf_2_3::Slice::Slice(Imf_2_3::PixelType, char*, unsigned long, unsigned long, int, int, double, bool, bool)' /usr/bin/ld: ../third_party/opencv3/lib64/libopencv_imgcodecs.so.3.4.7: undefined reference to `Imf_2_3::Chromaticities::Chromaticities(Imath_2_3::Vec2<float> const&, Imath_2_3::Vec2<float> const&, Imath_2_3::Vec2<float> const&, Imath_2_3::Vec2<float> const&)' /usr/bin/ld: ../third_party/opencv3/lib64/libopencv_imgcodecs.so.3.4.7: undefined reference to `Imf_2_3::OutputFile::writePixels(int)' /usr/bin/ld: ../third_party/opencv3/lib64/libopencv_imgcodecs.so.3.4.7: undefined reference to `Imf_2_3::ChannelList::insert(char const*, Imf_2_3::Channel const&)' /usr/bin/ld: ../third_party/opencv3/lib64/libopencv_imgcodecs.so.3.4.7: undefined reference to `Imf_2_3::hasChromaticities(Imf_2_3::Header const&)' collect2: error: ld returned 1 exit status make[2]: *** [CMakeFiles/ppocr.dir/build.make:320: ppocr] Error 1 make[1]: *** [CMakeFiles/Makefile2:115: CMakeFiles/ppocr.dir/all] Error 2 make: *** [Makefile:103: all] Error 2
最新发布
11-27
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值