Dynamisch ladbare Funktion



  • Hallo liebes Forum!
    Ich hätte da mal eine (für mich) recht schwierige Frage! Ich habe gelesen, daß man in einem Programm in C nicht alle enthaltenen Funktionen ins Hauptprogramm packen muss, sondern bestimmte Funktionen "Dynamisch" nachladen kann. leider habe ich bisher noch nirgends einen Hinweis gefunden, wie man so etwas implementieren könnte. (Über dll etc vielleicht?). Danke für eure Antworten.



  • DLLs sind windows-spezifisch, aber falls du für Windows programmierst, kannst du es über DLLs machen, ja. Du kannst dann bei Bedarf die Library laden per LoadLibrary , und per GetProcAddress holst du dir die Adresse einer Funktion und weist sie einem Funktionzeiger zu, den du vorher deklariert hast. Such einfach mal bei Microsoft nach den genannten Funktionen, da solltest du genug Infos finden.



  • Wenn ich aber meine EIGENEN Funktionen dynamisch laden will geht das nicht, oder? Ich müsste meine Funktionen quasi in eine .dll verpacken, um sie dynamisch nachzuladen.


  • Mod

    Darf ich mal die Vermutung äußern, dass der Threadersteller dynamisches Linken meint und sich bloß schlecht ausdrückt?

    Dafür braucht man gar nichts spezielles zu tun, das ist eher eine Einstellungsmöglichkeit deines Linkers und wie das zugrunde liegende Betriebssystem Programme ausführt.

    So geht das z.B. in Linux mit dem gcc:
    Quellcode:
    main.c:

    void foo();
    
    int main()
    {
      foo();
    }
    

    a.c:

    #include <stdio.h>
    
    void foo()
    {
      puts("Foo");
    }
    

    b.c

    #include <stdio.h>
    
    void foo()
    {
      puts("Bar");
    }
    
    $> gcc -fPIC -c a.c -o a.o      # a.c zu dynamisch linkbarem Objektcode machen
    $> gcc -shared -o liba.so a.o   # Diesen Code in eine dynamische Bibliothek packen
    $> gcc main.c -L. -la           # main.c übersetzen und gegen die dynamische Biblothek linken
    $> LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:.  # Ausnahmsweise das aktuelle Verzeichnis in den Suchpfad des dynamischen Linkers aufnehmen. Sollte man eigentlich nicht tun, aber das macht das Beispiel einfacher.
    $> a.out                        # Unser Programm ausführen. foo() wird dynamisch nachgeladen
    Foo
    $> gcc -fPIC -c b.c -o b.o      # b.c übersetzen
    $> gcc -shared -o liba.so b.o   # Und die Bibliothek überschreiben
    $> a.out                        # Mal sehen, was dieses mal passiert ;)
    Bar
    

    Sieht jetzt ein bisschen umständlich aus, weil ich es bis in's kleinste Detail gezeigt habe und alles von Hand gemacht habe. Normalerweise ist der ganze Vorgang mehr oder minder automatisiert.



  • Wow ! Danke. Hast recht, war schlecht ausgedrückt. So wird´s gehen. Thx doctor-C


Anmelden zum Antworten