trailas sarasota rentas rentar renta para habitaciones florida español efficiency bradenton baratos apartamentos alquiler c++ load shared-objects

sarasota - ¿Cómo puedo cargar un objeto compartido en C++?



rentas en bradenton florida (4)

Tengo un objeto compartido (un equivalente en Linux de una DLL de Windows) que me gustaría importar y usar con mi código de prueba.

Estoy seguro de que no es tan simple;) pero este es el tipo de cosas que me gustaría hacer ...

#include "headerforClassFromBlah.h" int main() { load( "blah.so" ); ClassFromBlah a; a.DoSomething(); }

Supongo que esta es una pregunta muy básica pero no puedo encontrar nada que me salte buscando en la web.


Debe #incluir cualquier encabezado asociado con la biblioteca compartida para obtener las descripciones de cosas como ClassFromBlah. Luego debe vincularse con el .so: exactamente cómo lo hace depende de su compilador e instalación general, pero para g ++ algo como:

g++ myfile.cpp -lblah

probablemente funcionará


Depende de la plataforma. Para hacerlo en tiempo de ejecución, en Linux, usa dlopen , en Windows, usa LoadLibrary .

Para hacerlo en tiempo de compilación, en Windows usted exporta el nombre de la función usando dllexport y dllimport . En linux, gcc exporta todos los símbolos públicos para que pueda enlazarlo normalmente y llamar a la función. En ambos casos, por lo general, esto requiere que tenga el nombre del símbolo en un archivo de encabezado que luego #include , luego se vincula a la biblioteca utilizando las facilidades de su compilador.


Es -l que vincula el archivo comprimido como libblah.a o si agrega -PIC a gcc obtendrá un archivo ''Objeto compartido'' libblah.so (es el enlazador el que lo construye). Tuve un SOL una vez y he construido este tipo de archivos. Los archivos pueden tener un número de revisión que debe ser exacto o superior (el código puede haber cambiado debido a un error). pero la llamada con parámetros debe ser igual a la salida.


Hay dos formas de cargar objetos compartidos en C ++

Para cualquiera de estos métodos, siempre necesitaría el archivo de encabezado para el objeto que desea usar. El encabezado contendrá las definiciones de las clases u objetos que desea utilizar en su código.

Inactivamente:

#include "blah.h" int main() { ClassFromBlah a; a.DoSomething(); } gcc yourfile.cpp -lblah

Dinámicamente (en Linux):

#include <stdio.h> #include <stdlib.h> #include <dlfcn.h> int main(int argc, char **argv) { void *handle; double (*cosine)(double); char *error; handle = dlopen ("libm.so", RTLD_LAZY); if (!handle) { fprintf (stderr, "%s/n", dlerror()); exit(1); } dlerror(); /* Clear any existing error */ cosine = dlsym(handle, "cos"); if ((error = dlerror()) != NULL) { fprintf (stderr, "%s/n", error); exit(1); } printf ("%f/n", (*cosine)(2.0)); dlclose(handle); return 0; }

* Robado de la página de manual de dlopen Linux El proceso en Windows o en cualquier otra plataforma es el mismo, simplemente reemplace dlopen con la versión de plataformas de búsqueda dinámica de símbolos.

Para que el método dinámico funcione, todos los símbolos que desea importar / exportar deben tener un enlace C externo.

Aquí hay algunas palabras sobre cuándo usar estática y cuándo usar enlaces dinámicos.