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.


Anmelden zum Antworten