zoo*_*ert 23 python linux ctypes
在Linux上,我有一个依赖于其他库的交流共享库.正确设置LD_LIBRARY_PATH以允许链接器加载所有库.当我做:
libgidcwf = ctypes.cdll.LoadLibrary(libidcwf_path)
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
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
Run Code Online (Sandbox Code Playgroud)
看来LD_LIBRARY_PATH在这里没有效果.有没有办法让这些依赖库"可加载"?
在此先感谢您的帮助.
Geo*_*edy 18
似乎libwav.so没有声明它依赖于定义ODBCGeneralQuery的库.尝试跑步ldd path-to-my-lib/libwav.so,看看是否缺少某些东西.如果这是您正在构建的共享库,则应该为库的代码使用的每个库添加-llibname链接命令(类似的那个gcc -shared -o libwav.so a.o b.o c.o).以这种方式由原始共享库引用的任何其他库也应自动加载.
我发现我必须使用RTLD_LAZY一个未链接的未定义符号,因为它没有被使用。由于ctypes.RTLD_LAZY我的 ctypes 中没有,我不得不使用:
ctypes.CDLL(libidcwf_path, mode=1)
Run Code Online (Sandbox Code Playgroud)
我通过检查/usr/include/bits/dlfcn.h可能不标准的方式发现了这种模式。对 ctypes 邮件列表上的这个 2006主题的帽子提示。
您应该使用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)
Run Code Online (Sandbox Code Playgroud)
小智 5
我有同样的问题。解决该问题需要做两件事:
RTLD_GLOBAL其他用户所说的ODBCGeneralQuery在let say中定义libIDCodbc,则需要首先运行以下行:ctypes.CDLL("libIDCodbc.so", mode = ctypes.RTLD_GLOBAL)
| 归档时间: |
|
| 查看次数: |
17331 次 |
| 最近记录: |