Shared Libary in Linux öffnen
-
Hallo, hat einer einen Link zu einem tutorial, wo beschrieben steht wie ich eine Dll /.so datei in Linux öffne? Ich habe mal von einer funktion dllopen gehört aber google findet nur misst....
Wichtig wäre für mich
=> wie funktioniert das generell?
=> Was nutzt linux anstelle von HMODULE oder HINSTANCE in Windows?
=> Wie kompiliere ich eine Projekt zu einer so datei?
-
Wir haben uns so viel Mühe gegeben die Suchfunktion wieder zu aktivieren. Aber die brauchst du nichtmal wenn du in die FAQ scheust.
Was spricht also gegen einen Blick in die FAQ.
-
hmmm ich weiss eure bemühungen zu schätzen....
Was das angeht: ich habe: dllopen () geschrieben, wurde aber nix gefunden....
Vielleicht bin ich auch nur zu doof dafür ich werds noch einmal versuchen
-
-
soweit zum Erstellen der Dll. Den Thread hatte ich auch schon grade gefunden... Wie siehts denn mit dem Laden einer dll von einer .x datei aus?
-
dlopen
dlsym
dlclose
-
hehe danke
also das was in Windows nen HINSTANCE ode rHMODULE wird, wir d in Linux einfach in einem void* gespeichert?
Gruß Sebastian
-
Hallo
In der Tat im Forum gabs nichts über dlopen usw. In FAQ ist nur ein Thread wie man .so Librarys erstellt und sie beim kompilieren einbindet aber Unix-Tom hat mir dann die richtigen Stichwörter gepostet.
@fluxy
Ich weiss nicht wie weit Du in zwischen bist aber vielleicht hift Dir ein kleines Beispiel von mir://main.cpp #include <stdio.h> #include <unistd.h> #include <dlfcn.h> int main() { typedef void (*f1)(); //hier wird ein Datentyp "f1" definiert, //es ist ein Zeigar der auf eine Funktion //zeigt die keine Argumente übernimmt und //von Typ void ist. typedef void (*f2)(int, int);//hier wird ein Datentyp "f2" definiert, //es ist ein Zeigar der auf eine Funktion //zeigt die Argumente von Typ int übernimmt //und von Typ void ist. void *handle = dlopen("./libhello.so.1.0", RTLD_LAZY);//hier wird die Library geladen, //wozu die Konstante RTLD_LASY //da ist weiss ich nicht if (handle!=0) { f1 hello = (f1) dlsym(handle, "hello");//deklariere Variable "hello" //vom Typ f1 und gleichzeitig //wird ihr die Adresse der //Funktion "hello" zugewiesen f2 add = (f2) dlsym(handle, "add");//deklariere Variable "add" vom //Typ f2 und gleichzeitig wird //ihr die Adresse der Funktion //"add" zugewiesen printf("Library erfolgreich geöffnet\n"); printf("Rufe Funktion hello auf...\n"); hello();//rufe "hello" auf printf("Rufe Funktion add auf...\n"); add(23,56);//rufe "add" auf printf("Schliesse library...\n"); dlclose(handle);//hier wird die Library aus dem Speicher gelöscht } else { printf("Library konnte nicht geöffnet werden!\n"); return 1; } return 0; }
So muss man den Code kompilieren:
g++ -Wall -rdynamic -o main main.cpp -ldl
Hier Link auf die
http://www.kielnet.net/home/marc.in/Linux/hello.zip
Kopiere sie einfach in das Verzichnisin dem sich das Programm befindet.Man muss beachten das die Funktionen in der Library, die man öffnen will, müssen mit extern "C" deklariert worden sein. Warum das so ist weis ich nicht.
-
Du solltest allerdings libtool verwenden, damit das Zeug nicht nur unter Linux läuft.