[英]Segmentation fault (core dumped) during loading shared library in Python ctypes
[英]ctypes loading a c shared library that has dependencies
在Linux上,我有一个依赖于其他库的交流共享库。 正确设置LD_LIBRARY_PATH以允许链接器加载所有库。 当我做:
libgidcwf = ctypes.cdll.LoadLibrary(libidcwf_path)
我收到以下错误:
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在这里没有效果。 有没有办法让这些依赖库“可加载”?
先谢谢您的帮助。
似乎libwav.so没有声明它依赖于定义ODBCGeneralQuery的库。 尝试运行ldd path-to-my-lib/libwav.so
并查看是否缺少某些内容。 如果这是您正在构建的共享库,则应将-llibname
添加到链接命令(类似于gcc -shared -o libwav.so ao bo co
那个)中,以用于库代码使用的每个库。 以这种方式由原始共享库引用的任何其他库也应自动加载。
您应该使用RTLD_GLOBAL 。 我有一个混合平台系统,所以我的代码看起来像这样:
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)
编译共享对象时,请确保将所有-lsomething
放在string命令的末尾。 对我来说,它解决了这个问题。
我有同样的问题。 为了解决这个问题,需要做两件事:
RTLD_GLOBAL
ODBCGeneralQuery
中定义了libIDCodbc
,则首先需要运行以下行: ctypes.CDLL("libIDCodbc.so", mode = ctypes.RTLD_GLOBAL)
我发现我必须使用RTLD_LAZY
因为未链接的未定义符号,因为它没有被使用。 由于我的ctypes中没有ctypes.RTLD_LAZY
,我不得不使用:
ctypes.CDLL(libidcwf_path, mode=1)
我通过检查/usr/include/bits/dlfcn.h
找到了这种模式,这可能不是标准的。 帽子提示ctypes邮件列表上的这个2006 线程 。
根据Walter Nissen的上述答案 ,您可以将代码修改为:
import os
ctypes.CDLL(libidcwf_path, mode=os.RTLD_LAZY)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.