Ctypes Loading A C Shared Library That Has Dependencies
Solution 1:
It would seem that libwav.so does not declare it's dependency on the library defining ODBCGeneralQuery. Try running ldd path-to-my-lib/libwav.so
and see if there's something missing. If this is a shared library that you are building you should add -llibname
to the linking command (the one that is something like gcc -shared -o libwav.so a.o b.o c.o
) for each library that the library's code uses. Any other libraries referenced by the original shared library in this way should automatically be loaded as well.
Solution 2:
You should use RTLD_GLOBAL. I have a mixed platform system, so my code looks something like this:
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)
Solution 3:
I found I had to use RTLD_LAZY
due to an undefined symbol that was not linked because it was not being used. Since there is no ctypes.RTLD_LAZY
in my ctypes, I had to use:
ctypes.CDLL(libidcwf_path, mode=1)
I found this mode by inspecting /usr/include/bits/dlfcn.h
which is probably not standard. Hat tip to this 2006 thread on the ctypes mailing list.
Solution 4:
When you compile the shared object, be sure to put all the -lsomething
at the end of the string command. For me it solved the problem.
Solution 5:
I had the same problem. Two things were required in order to solve it:
- use the
RTLD_GLOBAL
as other users said - You need to load every library that is used by your library. So if
ODBCGeneralQuery
is defined in lets saylibIDCodbc
, you need first run this line:
ctypes.CDLL("libIDCodbc.so", mode = ctypes.RTLD_GLOBAL)
Post a Comment for "Ctypes Loading A C Shared Library That Has Dependencies"