首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >ctypes加载具有依赖项的c共享库

ctypes加载具有依赖项的c共享库
EN

Stack Overflow用户
提问于 2010-02-24 23:53:22
回答 5查看 21.8K关注 0票数 26

在Linux上,我有一个依赖于其他库的c共享库。LD_LIBRARY_PATH被正确设置为允许链接器加载所有库。当我这样做的时候:

代码语言:javascript
复制
libgidcwf    = ctypes.cdll.LoadLibrary(libidcwf_path)

我得到以下错误:

代码语言:javascript
复制
Traceback (most recent call last):
  File "libwfm_test.py", line 12, in <module>
    libgidcwf    = ctypes.cdll.LoadLibrary(libidcwf_path)
  File "/usr/lib/python2.5/ctypes/__init__.py", line 431, in LoadLibrary
    return self._dlltype(name)
  File "/usr/lib/python2.5/ctypes/__init__.py", line 348, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: path-to-my-lib/libwav.so: undefined symbol: ODBCGeneralQuery

看起来LD_LIBRARY_PATH在这里没有效果。有没有办法让这些依赖库“可加载”?

提前感谢你的帮助。

EN

回答 5

Stack Overflow用户

发布于 2010-02-25 01:22:53

看起来libwav.so并没有声明它对定义ODBCGeneralQuery的库的依赖。尝试运行ldd path-to-my-lib/libwav.so,看看是否缺少了什么。如果这是您正在构建的共享库,则应该为该库的代码使用的每个库向链接命令(类似于gcc -shared -o libwav.so a.o b.o c.o的命令)添加-llibname。原始共享库以这种方式引用的任何其他库也应该自动加载。

票数 18
EN

Stack Overflow用户

发布于 2012-01-31 06:39:30

您应该使用RTLD_GLOBAL。我有一个混合平台系统,所以我的代码看起来像这样:

代码语言:javascript
复制
import numpy, ctypes
try:
  if "Linux" in esmfos:
    _ESMF = ctypes.CDLL(libsdir+'/libesmf.so',mode=ctypes.RTLD_GLOBAL)
  else:
    _ESMF = numpy.ctypeslib.load_library('libesmf',libsdir)
except:
  traceback.print_exc(file=sys.stdout)
  sys.exit(ESMP_ERROR_SHAREDLIB)
票数 8
EN

Stack Overflow用户

发布于 2017-12-23 01:39:36

我发现我不得不使用RTLD_LAZY,因为一个未定义的符号没有被链接,因为它没有被使用。因为在我的ctype中没有ctypes.RTLD_LAZY,所以我不得不使用:

代码语言:javascript
复制
ctypes.CDLL(libidcwf_path, mode=1)

我通过检查/usr/include/bits/dlfcn.h发现了这种模式,这可能不是标准的。在ctypes邮件列表中,向这个2006年的thread致敬。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2327344

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档