webentwicklung-frage-antwort-db.com.de

Wie lade ich ein freigegebenes Objekt in C++?

Ich habe ein gemeinsames Objekt (also das Linux-Äquivalent einer Windows-DLL), das ich importieren und mit meinem Testcode verwenden möchte.

Ich bin mir sicher, dass es nicht so einfach ist;), aber das ist die Art von Sache, die ich gerne machen würde.

#include "headerforClassFromBlah.h"

int main()
{
    load( "blah.so" );

    ClassFromBlah a;
    a.DoSomething();
}

Ich nehme an, dass dies eine wirklich grundlegende Frage ist, aber ich kann nichts finden, was mich beim Durchsuchen des Webs überfordert.

19
Ben L

Es gibt zwei Möglichkeiten, freigegebene Objekte in C++ zu laden

Für jede dieser Methoden benötigen Sie immer die Header-Datei für das Objekt, das Sie verwenden möchten. Die Kopfzeile enthält die Definitionen der Klassen oder Objekte, die Sie in Ihrem Code verwenden möchten.

Statisch:

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

gcc yourfile.cpp -lblah

Dynamisch (unter 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;
}

* Gestohlen von dlopen Linux man page Der Vorgang unter Windows oder jeder anderen Plattform ist derselbe. Ersetzen Sie einfach dlopen durch die Plattformversion der dynamischen Symbolsuche.

Damit die dynamische Methode funktioniert, müssen alle Symbole, die Sie importieren/exportieren möchten, über eine externe C-Verknüpfung verfügen.

Es gibt einige Wörter Hier über die Verwendung von statischen und dynamischen Verknüpfungen.

39
Salgar

Das hängt von der Plattform ab. Um dies zur Laufzeit zu tun, verwenden Sie unter Linux dlopen , unter Windows LoadLibrary .

Um dies beim Kompilieren zu tun, exportieren Sie unter Windows den Funktionsnamen mit dllexport und dllimport . Unter Linux exportiert gcc alle öffentlichen Symbole, sodass Sie ganz normal darauf verlinken und die Funktion aufrufen können. In beiden Fällen ist es normalerweise erforderlich, dass Sie den Namen des Symbols in einer Header-Datei haben, die Sie dann #include und dann mithilfe der Funktionen Ihres Compilers mit der Bibliothek verknüpfen.

5

Sie müssen alle mit der gemeinsam genutzten Bibliothek verknüpften Header einschließen, um die Deklarationen von Dingen wie ClassFromBlah abzurufen. Sie müssen dann gegen die .so-Datei verlinken. Wie Sie dies tun, hängt von Ihrem Compiler und der allgemeinen Installation ab. Für g ++ gilt jedoch Folgendes:

g++ myfile.cpp -lblah

wird wahrscheinlich funktionieren.

3
anon

Es ist -l, das die Archivdatei wie libblah.a verknüpft, oder wenn Sie -PIC zu gcc hinzufügen, erhalten Sie eine 'shared Object'-Datei libblah.so (der Linker, der sie erstellt). Ich hatte einmal eine Sun und habe diese Art von Dateien erstellt. Die Dateien können eine Versionsnummer haben, die genau oder höher sein muss (Der Code kann sich aufgrund eines Fehlers geändert haben). Der Aufruf mit Parametern muss jedoch mit der Ausgabe identisch sein.

0
user3213642