Skip to content Skip to sidebar Skip to footer

Ctypes Loading A C Shared Library That Has Dependencies

On Linux, I have a c shared library that depends on other libs. LD_LIBRARY_PATH is properly set to allow the linker to load all the libraries. When I do: libgidcwf = ctypes.cdll

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:

  1. use the RTLD_GLOBAL as other users said
  2. You need to load every library that is used by your library. So if ODBCGeneralQuery is defined in lets say libIDCodbc, 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"