Estoy cargando dinámicamente (con dlopen()
) un objeto compartido (llamado libprofile1.so
) de main
.restricciones al cargar dinámicamente un objeto compartido desde otro objeto compartido?
En libprofile1.so
he definido la función de fábrica CreateProfile
y la clase Profile
. La función CreateProfile
crea una instancia de la clase Profile
y le devuelve un puntero. La clase Profile
tiene un método pMethod
.
En principal, después de la carga libprofile1.so
, llamo CreateProfile
método que devuelve el puntero al objeto de Profile
clase (lo llaman p
).
Después, estoy llamando al método pMethod
contra el objeto p
(p->pMethod
). En este método, estoy cargando dinámicamente otro objeto compartido (libdatasources.so
).
En este objeto compartido tengo una función de fábrica CreateDataSource
y clase DataSource
.
CreateDataSource
función crea una instancia de clase DataSource
y le devuelve un puntero. La clase DataSource
tiene el método dsMethod
.
Como puede observar, las estructuras de ambos objetos compartidos son similares.
De pMethod
después de cargar libdatasources.so
estoy llamando CreateDataSource
método, lo que me devuelve un puntero a una instancia de la clase DataSource
, llamarlo ds
. Luego llamo al dsMethod
del ds
objeto
(ds->dsMethod
).
Ahora, el problema está siguiendo.
cuando intento llamar dsMethod
de ds
objeto, objeto compartido que soy la primera carga (libprofile1.so
) no se carga. En realidad, dlopen()
devuelve NULL
. Cuando leí dlerror
después dlopen
me sale:
./libprofile1.so: undefined symbol: _ZN18DataSource13dsMethod
Así que si tengo una llamada ds->Method
, que el primer objeto compartido no se carga!
Si hago un comentario llame al ds->dsMethod
desde la fuente, entonces mi libprofile1.so
y libdatasources.so
se cargan sin ningún problema.
No veo la conexión entre la llamada de un método desde el segundo SO, con la carga primero SO ???
Tal vez no sé, pero ¿hay alguna restricción cuando se carga dinámicamente un objeto compartido, desde un objeto compartido que también se ha cargado dinámicamente?
Btw, dlopen
se utiliza con RTLD_NOW|RTLD_GLOBAL
. Intenté con RTLD_LAZY
, pero sigue siendo el mismo problema.
ACTUALIZACIÓN:
bibliotecas se construyen en Eclipse. Las opciones para el compilador y el enlazador G ++ son las mismas para ambas bibliotecas.
Éstos son G ++ Compiler:
-O0 -g3 -Wall -c -fmessage-length=0
y G ++ enlazador:
-shared
opciones, pegado de Project Properties -> Settings -> Tool Settings
Gracias de antemano.
¿Puede actualizar su pregunta indicando cómo se crean libprofile1.so y libdataresources.so? –