Undefined symbol at execution

Hello,

I’m having the following problem with pyroot and I can’t understand it…
I have 2 separated c++ libraries, say libA.so and libB.so containing some c++ objects.
They also contain a cint dictionary so the objects defined in A and B are available to pyroot.
I can load the libraries through ROOT.gSystem.Load() call.
From pyroot, I can then access without problem the class defined in A, say ClassA, instantiate an object and call its methods.

Now in B there is a class, say ClassB, having as data member a ClassA object.
I can instantiate ClassB but when I call any method from ClassB which uses internally a ClassA method through its data member, it results in something like :

/bin/python: symbol lookup error: /path/to/lib/libB.so: undefined symbol: _ZN4Root18ClassA15theMethodEfRf

and pyroot exits immediately.

Is there an obvious reason to this behaviour ? any thing I can try to debug this ?

Didn’t find a solution yet, but :

  • I Compiled the same libraries on a different machine, same architecture (x86_64), same ROOT version (5.32) but with a more recent python (2.7 vs 2.6) : works as expected !
  • Independently, there is a workaround : use the archive file libA.a and libB.a and combine them in a new libAandB.so. Then load only libAandB.so and the error disappears.

Still I’d like to understand why the orginal problem occured. if anyaone has an idea…

Hi,

you can use the LD_DEBUG variable to debug (set it to ‘help’ to see its options). I think, though, that libB needs to be linked with libA, or when libA is loaded, it should be loaded first and have RTLD_GLOBAL set (which I thought was the default for gSystem.Load()). Try loading them with ctypes.CDLL instead of gSystem, setting RTLD_GLOBAL and RTLD_NOW flags:

import ctypes la = ctypes.CDLL("libA.so", 0x100 | 0x2) lb = ctypes.CDLL("libB.so", 0x100 | 0x2)
Cheers,
Wim