/usr/bin/ld: /lib/x86_64-linux-gnu/libgobject-2.0.so.0: undefined reference to `ffi_type_uint32@LIBF

ubuntu20.04下,在c++中调用python代码时,编译遇到以下错误:

/usr/bin/ld: /lib/x86_64-linux-gnu/libgobject-2.0.so.0: undefined reference to ffi_type_uint32@LIBFFI_BASE_7.0' /usr/bin/ld: /lib/x86_64-linux-gnu/libgobject-2.0.so.0: undefined reference toffi_type_sint32@LIBFFI_BASE_7.0’
/usr/bin/ld: /lib/x86_64-linux-gnu/libgobject-2.0.so.0: undefined reference to ffi_type_float@LIBFFI_BASE_7.0' /usr/bin/ld: /lib/x86_64-linux-gnu/libgobject-2.0.so.0: undefined reference toffi_type_pointer@LIBFFI_BASE_7.0’
/usr/bin/ld: /lib/x86_64-linux-gnu/libgobject-2.0.so.0: undefined reference to ffi_type_uint64@LIBFFI_BASE_7.0' /usr/bin/ld: /lib/x86_64-linux-gnu/libgobject-2.0.so.0: undefined reference toffi_type_void@LIBFFI_BASE_7.0’
/usr/bin/ld: /lib/x86_64-linux-gnu/libgobject-2.0.so.0: undefined reference to ffi_type_double@LIBFFI_BASE_7.0' /usr/bin/ld: /lib/x86_64-linux-gnu/libgobject-2.0.so.0: undefined reference toffi_type_sint64@LIBFFI_BASE_7.0’
/usr/bin/ld: /lib/x86_64-linux-gnu/libgobject-2.0.so.0: undefined reference to ffi_prep_cif@LIBFFI_BASE_7.0' /usr/bin/ld: /lib/x86_64-linux-gnu/libgobject-2.0.so.0: undefined reference toffi_call@LIBFFI_BASE_7.0’

根据这篇文章Conda虚拟环境下libp11-kit.so.0: undefined symbol: ffi_type_pointer…问题解决的操作,解决了编译问题。步骤如下:

  1. 找到所使用的python环境,进到它的lib下,比如我的是~/miniconda3/envs/py38/lib
  2. cd ~/miniconda3/envs/py38/lib
  3. 查看:ll | grep libffi
    在这里插入图片描述
  4. 备份:mv libffi.so.7 libffi.so.7-bak
  5. 重新链接:ln -s /lib/x86_64-linux-gnu/libffi.so.7.1.0 libffi.so.7
  6. 结果
    在这里插入图片描述

但我还遇到另一个大坑:运行时仍然报错!折腾了我好久,原来是c++的opnecv版本跟python的opencv-python不一致导致的,解决就是尽量让opencv版本和opencv-python版本保持一致

  1. /usr/local/bin/opencv_version

3.4.15

  1. python3 -c "import cv2; print(cv2.__version__)"

3.4.15

<think>好的,我现在需要解决用户在Ubuntu 20.04上安装OpenCV 4.8.0时遇到的链接错误,具体是libgobject-2.0.so.0中未定义的引用ffi_prep_cif@LIBFFI_BASE_7.0。这个问题看起来和之前引用的那些问题类似,可能涉及libffi库的版本或符号链接问题。 首先,用户提供的引用中,引用[1]和[2]都提到了类似的undefined symbol问题,特别是涉及libffi的情况。引用[1]的解决方法是备份现有的libffi.so.7并重新链接到正确的库文件。引用[2]中的错误同样涉及到libffi的符号问题,可能也是类似的解决方法。而引用[3]则是安装缺失的库,不过这里的问题可能更复杂,因为涉及到符号链接而非单纯的缺失库。 用户的问题是关于libgobject-2.0.so.0找不到ffi_prep_cif符号,而该符号属于libffi的LIBFFI_BASE_7.0版本。这可能意味着系统中安装的libffi版本与编译或链接时所需的版本不兼容,或者符号链接不正确,导致程序找不到正确的符号。 首先,我需要确认libffi是否已正确安装,并且版本是否兼容。在Ubuntu中,可以通过apt来安装libffi-dev,但可能用户已经安装了不同版本,或者存在多个版本冲突。接下来,检查系统中是否存在libffi.so.7的文件,并确认其指向正确的版本。例如,在引用[1]中,用户将libffi.so.7重新链接到/lib/x86_64-linux-gnu/libffi.so.7.1.0,这可能是因为conda环境中的链接错误指向了旧版本或不存在的文件。 此外,用户的问题可能发生在编译OpenCV时,链接器找不到正确的libffi库。可能的原因是conda环境中的库与系统库冲突。当使用conda环境时,有时候conda会覆盖一些系统库的链接,导致编译时使用了错误版本的库。因此,需要检查conda环境中是否存在libffi相关的库,并确保其符号链接正确。 可能的解决步骤包括: 1. 检查系统libffi的安装情况:使用apt确认libffi-dev和相关包是否已安装,并确保版本符合要求。 2. 检查conda环境中的libffi库:进入conda环境的lib目录,查看libffi.so的链接是否正确,可能需要备份并重新创建符号链接,指向系统库的正确版本。 3. 确保在编译OpenCV时,链接器优先使用系统库而不是conda环境中的库,可以通过设置环境变量如LD_LIBRARY_PATH或者调整编译参数来实现。 4. 重新编译OpenCV,确保所有依赖库正确链接。 另外,参考引用[2]中的解决方法,可能需要处理libgobject-2.0.so.0的依赖关系,可能需要更新相关的库如glib2.0,或者重新安装依赖库以确保其链接到正确的libffi版本。 总结下来,问题可能出在conda环境中的libffi库链接错误,导致编译OpenCV时使用了错误版本的libffi,从而出现未定义符号的错误。解决方法需要修复符号链接,确保使用系统正确的libffi版本。</think>以下为解决Ubuntu 20.04上安装OpenCV 4.8.0时出现`libgobject-2.0.so.0`链接错误的分步指南: --- ### **问题分析** 错误`undefined symbol: ffi_prep_cif@LIBFFI_BASE_7.0`表明动态链接器在`libgobject-2.0`中找不到`libffi`库的特定符号。可能原因包括: 1. **libffi库版本不兼容**:系统或Conda环境中的`libffi`版本与编译需求冲突[^1][^2]。 2. **符号链接错误**:Conda虚拟环境中的`libffi.so`未正确指向系统库。 3. **依赖库缺失**:未安装`libffi-dev`或其他相关开发包[^3]。 --- ### **解决方法** #### **步骤1:安装系统级libffi依赖** ```bash sudo apt-get update sudo apt-get install libffi-dev libffi7 # 确保系统libffi版本为7.x ``` #### **步骤2:修复Conda环境中的符号链接** 1. 进入Conda环境的`lib`目录: ```bash cd ~/miniconda3/envs/<your_env>/lib # 替换<your_env>为实际环境名 ``` 2. 备份原有链接并创建新链接: ```bash mv libffi.so.7 libffi.so.7-bak # 备份 ln -s /usr/lib/x86_64-linux-gnu/libffi.so.7.1.0 libffi.so.7 # 链接到系统库 ``` #### **步骤3:检查glib2.0依赖** ```bash sudo apt-get install libglib2.0-dev # 安装或更新glib2.0开发包 ``` #### **步骤4:重新编译OpenCV** 1. 清除之前的编译缓存: ```bash rm -rf build mkdir build && cd build ``` 2. 配置时显式指定库路径: ```bash cmake -D CMAKE_PREFIX_PATH=/usr/lib/x86_64-linux-gnu .. ``` 3. 编译并安装: ```bash make -j$(nproc) sudo make install ``` --- ### **验证修复** 运行依赖`libgobject`的OpenCV程序或检查链接: ```bash ldd /path/to/your/opencv_binary | grep libgobject # 确认链接路径正确 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值