Estoy intentando compilar el siguiente código de ejemplo de biblioteca DL simple desde Program-Library-HOWTO con g ++. Esto es solo un ejemplo, así puedo aprender a usar y escribir bibliotecas compartidas. El código real para la biblioteca que estoy desarrollando estará escrito en C++.Compilación de biblioteca dinámica compartida con g ++
#include <stdlib.h>
#include <stdio.h>
#include <dlfcn.h>
int main(int argc, char **argv) {
void *handle;
double (*cosine)(double);
char *error;
handle = dlopen ("/lib/libm.so.6", RTLD_LAZY);
if (!handle) {
fputs (dlerror(), stderr);
exit(1);
}
cosine = dlsym(handle, "cos");
if ((error = dlerror()) != NULL) {
fputs(error, stderr);
exit(1);
}
printf ("%f\n", (*cosine)(2.0));
dlclose(handle);
}
Si puedo compilar el programa con gcc que trabaja muy bien.
gcc -o foo foo.c -ldl
Cuando se cambia el nombre de archivo y compilador para el siguiente
g++ -o foo foo.cpp -ldl
me sale el siguiente error:
foo.cpp:16: error: invalid conversion from 'void*' to 'double (*)(double)'
entiendo (I piensan entiendo, corrígeme si esto está mal) que no puedo hacer un lanzamiento implícito desde un puntero void en C++, pero C me permite, y esta es la razón por la cual el código anterior se compilará usando gcc pero no usin g g ++. Así que he intentado una conversión explícita al cambiar la línea 16 arriba a:
cosine = (double *)dlsym(handle, "cos");
Con esto en su lugar, me sale el siguiente error:
foo.cpp:16: error: cannot convert 'double*' to 'double (*)(double)' in assignment
Estos problemas probablemente tienen más que ver con mi propia ignorancia general de los estándares de codificación C++ adecuados más que cualquier otra cosa. ¿Alguien puede indicarme un buen tutorial sobre el desarrollo de bibliotecas dinámicas para Linux que utiliza el código de ejemplo de C++?
Sugiero pasar por 'Pensar en C++' para ponerte al día con C++. Como correctamente detectó, no puede convertir implícitamente void * a otros punteros en C++, y eso implica que realmente solo necesita ponerse al día con C++ en lugar de las otras áreas :) – workmad3
Gracias, estoy leyendo C++ Primer en mi tiempo libre, pero ahora tengo un proyecto pendiente. –