c类型加载具有依赖项的c共享库

2024-09-27 07:32:31 发布

您现在位置:Python中文网/ 问答频道 /正文

在Linux上,我有一个c共享库,它依赖于其他lib。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

似乎图书馆路径对这里没有影响。 有没有办法让这些依赖关系库“可加载”?

提前谢谢你的帮助。


Tags: pathnameinpyselfinitlibusr
3条回答

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

你应该用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命令的末尾。对我来说这解决了问题。

相关问题 更多 >

    热门问题