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

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.csdn.net/FRIGIDWINTER/article/details/129685867

ubuntu undefined reference to 问题解决方法-CSDN博客

猜你喜欢

转载自blog.csdn.net/coco_1998_2/article/details/141558906