在Linux上,我有一个依赖于其他库的c共享库。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
在这里没有效果。有没有办法让这些依赖库“可加载”?
首先要感谢你的帮助。
6条答案
按热度按时间ghhaqwfi1#
看起来,libwa.so并没有声明它对定义ODBCGeneralQuery的库的依赖。尝试运行
ldd path-to-my-lib/libwav.so
并查看是否缺少什么。如果这是您正在构建的共享库,则应该将-llibname
添加到该库代码使用的每个库的链接命令(类似于gcc -shared -o libwav.so a.o b.o c.o
的命令)中。原始共享库以这种方式引用的任何其他库也应该自动加载。ebdffaop2#
您应该使用RTLD_GLOBAL。我有一个混合平台系统,所以我的代码如下所示:
qvtsj1bj3#
我发现我不得不使用
RTLD_LAZY
,因为一个未定义的符号没有链接,因为它没有被使用。由于我的ctype中没有ctypes.RTLD_LAZY
,我不得不使用:我通过检查
/usr/include/bits/dlfcn.h
发现了这种模式,这可能不是标准的。向ctype邮件列表上的这个2006 thread致敬。wqsoz72f4#
编译共享对象时,请确保将所有
-lsomething
放在字符串命令的末尾。对我来说,它解决了问题。bvn4nwqk5#
我也有同样的问题。要解决这个问题,需要两件事:
1.按照其他用户的要求使用
RTLD_GLOBAL
1.您需要加载您的库使用的每个库。因此,如果在
libIDCodbc
中定义了ODBCGeneralQuery
,则需要首先运行以下行:ctypes.CDLL("libIDCodbc.so", mode = ctypes.RTLD_GLOBAL)
35g0bw716#
根据Walter Nissen上面的answer,您可以将代码修改为: