ctypes CDLL 默认路径是什么?

mei*_*er_ 5 python linux ctypes python-2.7

我正在尝试使用编译为/usr/local/lib/libName.so但同时运行需要此文件的 python 脚本的库:

from ctypes import CDLL
[...]
__lib = CDLL('libName.so')
Run Code Online (Sandbox Code Playgroud)

我得到:

OSError: libName.so: cannot open shared object file: No such file or directory

所以我想知道我需要在哪里复制 .so 文件,以便这个 CDLL 调用正常工作。

Cri*_*ati 6

ctypes ( [Python 3.5]: ctypes - Python 的外部函数库),使用dlopen ( [man7]: DLOPEN(3) ) 来加载库,它将加载(和隐式查找)任务委托给Lnx加载器。

搜索.so的路径在[man7]: LD.SO(8) 中有很好的解释。以下是关于默认值的说明:

  • 在默认路径/lib 中,然后是/usr/lib。(在某些 64 位体系结构上,64 位共享对象的默认路径是/lib64,然后是/usr/lib64。)

解决问题的方法(最常见):

  1. 将完整路径传递给CDLL
    • __lib = CDLL("/usr/local/lib/libName.so")
  2. 通过将它添加到${LD_LIBRARY_PATH} env var 来告诉加载器也在/usr/local/lib 中搜索.so s,为想要加载它的python进程添加它:
    • export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/lib
    • LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/lib python
  3. .so复制到默认搜索路径之一(虽然我不推荐它,但如果必须,请将其复制到/usr/lib而不是/lib