Autor
|
Tema: Problema con dlfcn.h. (Leído 2,191 veces)
|
0xDani
Desconectado
Mensajes: 1.077
|
Bueno estoy intentando usar funciones de librerias dinamicas sin hacer un include, y he encontrado un ejemplo en el que se consigue esto en una pagina de documentacion de dlfcn.h(pubs.opengroup.org/onlinepubs/7908799/xsh/dlsym.html). El problema es que he intentado hacer algo similar con una funcion que recibe dos enteros y retorna su suma y no me termina de salir. Aqui esta el codigo: #include <iostream> #include <dlfcn.h> using std::cout; int main() { int a=2, b=3; int fptr(int, int); void* handle = dlopen("libprueba.so", RTLD_LAZY); fptr = (int(int, int))dlsym(handle, "SampleAddInt"); int c = fptr(a, b); cout << c; dlclose(handle); return 0; }
Este es el contenido de libprueba.so: int SampleAddInt(int i1, int i2) { return i1 + i2; }
Y el error que me da el compilador es cuando le intento asignar a fptr el resultado de dlsym, me dice conversion invalida al tipo de funcion 'int(int, int)'. ¿Como lo puedo solucionar? Debe de haber alguna manera de realizar la conversion. Saludos.
|
|
|
En línea
|
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!
I code for $$$ Hago trabajos en C/C++ Contactar por PM
|
|
|
Eternal Idol
Kernel coder ajeno al tiempo
Moderador
 
Desconectado
Mensajes: 5.969
Israel nunca torturó niños, ni lo volverá a hacer.
|
int (*fptr)(int, int) = (int(*)(int, int))dlsym(handle, "SampleAddInt");
Aunque yo preferiria: typedef int (*SampleAddInt_ptr)(int,int); ... SampleAddInt_ptr SampleAddInt = (SampleAddInt_ptr)dlsym(handle, "SampleAddInt"); int c = SampleAddInt(a, b);
|
|
« Última modificación: 7 Agosto 2012, 22:22 pm por Eternal Idol »
|
En línea
|
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste. Juan Domingo Perón
|
|
|
0xDani
Desconectado
Mensajes: 1.077
|
Gracias por la respuesta, pero ya casi lo tengo solucionado, ahora lo unico que me falla es que no linkea con la libreria. Eso si, he desistido de pasarle parametros. Dejo el codigo por si a alguien le sirve, deberia funcionar. #include <iostream> #include <dlfcn.h> using std::cout; int main() { typedef void (*function)(); function result; void* handle = dlopen("libprueba-plugin2.so", RTLD_LAZY); result = (function)dlsym(handle, "Hello"); (*result)(); dlclose(handle); return 0; }
Saludos. Edit: No puedo compilar este programa, el compilador me lanza 'undefined reference to dlopen()' y lo mismo para las otras funciones de dlfcn.h. He probado a poner -ldl, pero el compilador me da estos errores: In function `__static_initialization_and_destruction_0(int, int)': main.cpp:(.text+0x6f): undefined reference to `std::ios_base::Init::Init()' main.cpp:(.text+0x74): undefined reference to `std::ios_base::Init::~Init()' collect2: ld devolvió el estado de salida 1
|
|
« Última modificación: 8 Agosto 2012, 12:05 pm por daniyo »
|
En línea
|
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!
I code for $$$ Hago trabajos en C/C++ Contactar por PM
|
|
|
Eternal Idol
Kernel coder ajeno al tiempo
Moderador
 
Desconectado
Mensajes: 5.969
Israel nunca torturó niños, ni lo volverá a hacer.
|
De nada y ahi arriba tenes como hacerlo con parametros y valor de retorno.
¿Estas usando g++ para compilar?
|
|
|
En línea
|
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste. Juan Domingo Perón
|
|
|
0xDani
Desconectado
Mensajes: 1.077
|
No, estaba usando gcc, pero ahora con g++ ha compilado. Ahora produce violacion de segmento xD.
Saludos.
|
|
|
En línea
|
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!
I code for $$$ Hago trabajos en C/C++ Contactar por PM
|
|
|
Eternal Idol
Kernel coder ajeno al tiempo
Moderador
 
Desconectado
Mensajes: 5.969
Israel nunca torturó niños, ni lo volverá a hacer.
|
No, estaba usando gcc, pero ahora con g++ ha compilado. Ahora produce violacion de segmento xD.
Saludos.
Deberias comprobar que dlsym no este devolviendo NULL antes de llamar a result.
|
|
|
En línea
|
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste. Juan Domingo Perón
|
|
|
0xDani
Desconectado
Mensajes: 1.077
|
Ah pues el problema ha resultado estar en dlopen(). dlerror() me dice que no pudo abrir la libreria dinamica. Es raro, porque la tengo en el mismo directorio. Voy a probar a ponerle la ruta completa. Saludos.
Edit: No la abre ni con la ruta completa. Edit2: Despues de dlopen(), llamo a dlerror() y me da el error: "libejemplo.so: cannot open shared object file: No such file or directory". He puesto la libreria dinamica en el mismo directorio que el programa, y tambien le he puesto la ruta completa, pero me sigue saltando el mismo error.
|
|
« Última modificación: 8 Agosto 2012, 17:53 pm por daniyo »
|
En línea
|
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!
I code for $$$ Hago trabajos en C/C++ Contactar por PM
|
|
|
|
|