Ich muss eine von mir erstellte Bibliothek dynamisch verknüpfen. Ich bin mir nicht sicher, was das Problem ist. Alles kompiliert korrekt, aber ich fange immer handle
als NULL
Zeiger:
Ich kann diesen Fehler nicht passieren und ich bin mir nicht sicher, was möglicherweise falsch ist. Ich bin mir ziemlich sicher, dass ich alles richtig zusammengestellt habe. Hier sind die Kompilierungsschritte, die ich verwendet habe:
%Vor%Ich erhalte einen Fehler, der
lautetnur ET_DYN und ET_EXEC können geladen werden.
Wenn Sie hw11-lib-michaelSchilling.so
erstellen, scheinen Sie gcc
nicht anzugeben, dass Sie ein gemeinsames Objekt wünschen (das .so
im Namen ist nicht genug).
Mit -c
wird eine Objektdatei erzeugt (kein shared Objekt) und sie wird als michaelSchilling.so
bezeichnet. Der Linker wird nicht einmal aufgerufen.
Entfernen Sie die -c
von der Befehlszeile gcc
und fügen Sie -shared
:
Ein Schrägstrich ( /
) als erstes Zeichen eines Pfadnamens gibt an, dass der Pfadname absolut (relativ zum Stammverzeichnis) ist, nicht relativ zum aktuellen Arbeitsverzeichnis und sicherlich nicht relativ zum Speicherort der Binärdatei. Sie müssen den vollständigen Pfad angeben, indem Sie den Speicherort der Binärdatei ermitteln (was an sich kein einfaches Problem darstellt), oder Sie können $ORIGIN
mit dlopen
verwenden (funktioniert mit rpath, bin aber unsicher, ob es mit dlopen
funktioniert).
Ist hw11-lib-michaelSchilling.so
im absoluten Wurzelverzeichnis Ihres Dateisystems? Sie behaupten, dass es einen Schrägstrich darauf führt ... aber ich vermute, dass es nicht ist.
Fügen Sie in Ihrer Fehlerbehandlung die Ausgabe von dlerror()
in Ihre Ausgabe ein, um die Fehlerursache zu finden.
funktioniert für mich unter Linux beim Kompilieren der Bibliothek
Für den Code, der es öffnet, benötigen Sie -ldl
Tags und Links c dll shared-libraries