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 的l
ibffi.so.7 指向系统l
ibffi.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