Richtige Verwendung von libdl und dynamisch verknüpften Bibliotheken
Lesezeit: 2 Minuten
Michael Schilling
Ich muss eine von mir erstellte Bibliothek dynamisch verknüpfen. Ich bin mir nicht ganz sicher, was das Problem ist. Es kompiliert alles richtig, aber ich fange immer an handle als die NULL Zeiger:
void *handle;
char *error;
handle = dlopen ("./hw11-lib-michaelSchilling.so", RTLD_LAZY);
//same error comes up with full path as well as './hw11...'
if(!handle){
error = dlerror();
printf("%s\n", error);
printf("Error loading library.\n");
exit(1);
}
Ich kann diesen Fehler nicht weitergeben und bin mir nicht sicher, was möglicherweise falsch sein könnte. Ich bin mir ziemlich sicher, dass ich alles richtig zusammengestellt habe. Hier sind die Kompilierungsschritte, die ich verwendet habe:
Zusammen mit -rdynamic? Habe es gerade mit beidem und mit just probiert -sharedaber ich habe den gleichen Fehler.
– Michael Schilling
3. Dezember 2011 um 22:16 Uhr
@MichaelSchilling: Ich glaube nicht -rdynamic irgendetwas mit dem Problem zu tun hat, also können Sie es genauso gut behalten, falls es von Ihrem Code benötigt wird.
– NPE
3. Dezember 2011 um 22:18 Uhr
@MichaelSchilling: Hast du die entfernt -c?
– NPE
3. Dezember 2011 um 22:19 Uhr
Ein Schrägstrich (/) als erstes Zeichen eines Pfadnamens zeigt an, dass der Pfadname absolut (relativ zum Stammverzeichnis), nicht relativ zum aktuellen Arbeitsverzeichnis und schon gar nicht relativ zum Speicherort der Binärdatei ist. Sie müssen den vollständigen Pfad angeben, indem Sie den Speicherort der Binärdatei herausfinden (was an sich kein einfaches Problem ist), oder Sie können ihn verwenden $ORIGIN mit dlopen (Es funktioniert mit rpath, aber ich bin mir nicht sicher, ob es mit funktioniert dlopen).
Was ist mit einer Periode vor dem Pfad? (./)
– Michael Schilling
3. Dezember 2011 um 21:59 Uhr
Das macht es relativ zum aktuellen Arbeitsverzeichnis, nicht zum Speicherort Ihrer Programmbinärdatei.
funktioniert für mich unter Linux beim Kompilieren der Bibliothek für den Code, der sie öffnet, den Sie benötigen -ldl
Ist hw11-lib-michaelSchilling.so im absoluten Stammverzeichnis Ihres Dateisystems? Sie behaupten, es wäre so, indem Sie einen Schrägstrich darauf führen … aber ich vermute, das ist es nicht.
Schließen Sie in Ihre Fehlerbehandlung die Ausgabe von ein dlerror() in dem, was Sie drucken, um die Fehlerursache zu finden.
14373600cookie-checkRichtige Verwendung von libdl und dynamisch verknüpften Bibliothekenyes