ImportError: Cannot load dynamic library. Did you compile LSD?

1、问题描述

>>> import pylsd2
Traceback (most recent call last):
  File "", line 1, in <module>
  File "/data/data/wangzy-p-wangzy-p3-volume-pvc-0fee40a7-7013-49b4-8cfb-b4ab0394165b/.conda/envs/paddle/lib/python3.8/site-packages/pylsd2/__init__.py", line 9, in <module>
    from pylsd2.wrapper import *
  File "/data/data/wangzy-p-wangzy-p3-volume-pvc-0fee40a7-7013-49b4-8cfb-b4ab0394165b/.conda/envs/paddle/lib/python3.8/site-packages/pylsd2/wrapper.py", line 8, in <module>
    from pylsd2.bindings.fn_types import *
  File "/data/data/wangzy-p-wangzy-p3-volume-pvc-0fee40a7-7013-49b4-8cfb-b4ab0394165b/.conda/envs/paddle/lib/python3.8/site-packages/pylsd2/bindings/__init__.py", line 9, in <module>
    from pylsd2.bindings.lsd_ctypes import *
  File "/data/data/wangzy-p-wangzy-p3-volume-pvc-0fee40a7-7013-49b4-8cfb-b4ab0394165b/.conda/envs/paddle/lib/python3.8/site-packages/pylsd2/bindings/lsd_ctypes.py", line 60, in <module>
    raise ImportError('Cannot load dynamic library. Did you compile LSD?')
ImportError: Cannot load dynamic library. Did you compile LSD?

2、源码分析

查看pylsd2/bindings/lsd_ctypes.py文件,报错行lsdlib = ctypes.cdll[os.path.join(root_dir, libdir, libname)] ,debug分析,真实的报错的原因是加载报错linux/liblsd.so报错:

import ctypes
ctypes.cdll["/home/jovyan/.conda/envs/paddle/lib/python3.8/site-packages/pylsd2/lib/linux/liblsd.so"]

报错描述如下:

>>> import ctypes
>>> ctypes.cdll["/usr/local/lib/python3.7/dist-packages/pylsd2/lib/linux/liblsd.so"]
Traceback (most recent call last):
  File "", line 1, in <module>
  File "/usr/lib/python3.7/ctypes/__init__.py", line 439, in __getitem__
    return getattr(self, name)
  File "/usr/lib/python3.7/ctypes/__init__.py", line 434, in __getattr__
    dll = self._dlltype(name)
  File "/usr/lib/python3.7/ctypes/__init__.py", line 364, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: /lib/x86_64-linux-gnu/libm.so.6: version `GLIBC_2.29' not found (required by /usr/local/lib/python3.7/dist-packages/pylsd2/lib/linux/liblsd.so)

3、问题解决:

1、查看当前glibc版本:

ldd --version

返回以下结果:

ldd (Ubuntu GLIBC 2.27-3ubuntu1.6) 2.27

或者使用以下命令查看:

strings /lib/x86_64-linux-gnu/libm.so.6 | grep GLIBC_

返回以下结果:

GLIBC_2.2.5
GLIBC_2.4
GLIBC_2.15
GLIBC_2.18
GLIBC_2.23
GLIBC_2.24
GLIBC_2.25
GLIBC_2.26
GLIBC_2.27
GLIBC_PRIVATE

2、下载glibc-2.29到指定目录:

cd /usr/local
wget -4c https://ftp.gnu.org/gnu/glibc/glibc-2.29.tar.gz

3、解压并创建相应文件夹:

tar -zxf glibc-2.29.tar.gz
cd glibc-2.29
mkdir build
cd build/
sudo apt-get install gawk bison -y
../configure --prefix=/usr/local --disable-sanity-checks

4、安装:

make -j18
make install

5、软链接建立:

查看当前链接情况(新终端运行):

cd /lib/x86_64-linux-gnu
ll

输出以下结果(输出结果很长,主要查看libm.so.6的对应项):

libm.so.6 --> libm-2.27.so

可以看到此时链接到的还是2.27版本;接下来要为我们刚刚安装的2.29版本创建软链接

将刚才安装的libm-2.29.so复制到/lib/x86_64-linux-gnu下(注意⚠️libm-2.29.so被安装在/usr/local/lib ;这和我们前面配置–prefix=/usr/local相对应,如果安装的位置不同,可相应的修改) ,若都是严格按照上面的步骤进行,可直接用以下命令进行复制:

cp /usr/local/lib/libm-2.29.so /lib/x86_64-linux-gnu/

添加软链接:

ln -sf libm-2.29.so libm.so.6

查验结果:

λ 6894faccd8f9 /lib/x86_64-linux-gnu ldd --version
ldd (GNU libc) 2.29
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Written by Roland McGrath and Ulrich Drepper

至此,问题已解决

λ 6894faccd8f9 /lib/x86_64-linux-gnu python
Python 3.7.13 (default, Apr 24 2022, 01:04:09) 
[GCC 7.5.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import pylsd2

参考资料

https://zhuanlan.zhihu.com/p/549870561
特此感谢这位知乎老师的详细教程!!!

你可能感兴趣的:(python,计算机视觉,linux,人工智能,运维)