【问题标题】:Python not finding library in /usr/lib/x86_64-linux-gnu that ldconfig -p does findPython 在 /usr/lib/x86_64-linux-gnu 中找不到 ldconfig -p 确实找到的库
【发布时间】:2016-05-03 18:57:53
【问题描述】:

我正在尝试使用 python 模块 cairocffi。我在 x86-64 上使用 Debian (Stretch),所以我安装了 apt 包 libcairo2-dev 并使用 pip 安装了 cairocffi python 包。这一切都很顺利。但是当我尝试导入它时,它无法加载模块:

$ python -c "import cairocffi; print('OK')"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/cairocffi/__init__.py", line 46, in <module>
    cairo = dlopen(ffi, 'cairo', 'cairo-2')
  File "/usr/local/lib/python2.7/dist-packages/cairocffi/__init__.py", line 43, in dlopen
    raise OSError("dlopen() failed to load a library: %s" % ' / '.join(names))
OSError: dlopen() failed to load a library: cairo / cairo-2

但是,ldconfig 确实知道 libcairo.so

$ sudo ldconfig -p | grep cairo
        libpangocairo-1.0.so.0 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libpangocairo-1.0.so.0
        libpangocairo-1.0.so (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libpangocairo-1.0.so
        libcairo.so.2 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libcairo.so.2
        libcairo.so (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libcairo.so
        libcairo-script-interpreter.so.2 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libcairo-script-interpreter.so.2
        libcairo-script-interpreter.so (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libcairo-script-interpreter.so
        libcairo-gobject.so.2 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libcairo-gobject.so.2
        libcairo-gobject.so (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libcairo-gobject.so

当我使用修改后的LD_LIBRARY_PATH 运行 python 时,它可以工作:

$ LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu python -c "import cairocffi; print('OK')"
OK

为了可扩展性和可维护性,我不想在修改后的 LD_LIBRARY_PATH 上运行 python 来运行这个脚本,但我不明白为什么它没有选择显然是动态链接器确实知道。我错过了什么?

【问题讨论】:

    标签: python linux debian shared-libraries


    【解决方案1】:

    原来有一个旧的 libpixman.so 隐藏在我的 /usr/lib(这是 libcairo 的依赖项)中,而安装 libcairo 的文件夹中有一个较新的 libpixman。因此,当LD_LIBRARY_PATH 设置为 libcairo 的位置时,它会选择新的可以工作的 libpixman,而当它没有设置时,它会选择旧的 libpixman。从 /usr/lib 中删除旧的 libpixman 修复了所有问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-09-28
      • 2019-02-23
      • 2018-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-14
      • 1970-01-01
      相关资源
      最近更新 更多