C ++ Linux: dlopen kann die .so-Bibliothek nicht finden

Umformulierte Frage (obwohl bereits gelöst):

Ich hatte Probleme, mit dlopen (3) eine gemeinsam genutzte Objektbibliothek unter Linux zu laden. Die Bibliothek ist Teil eines von mir erstellten Bibliothekssystems, das alle zur Laufzeit von einer zentralen ausführbaren Datei geladen werden. All dies ist in Code :: Blocks in einem einzigen Arbeitsbereich organisiert, in dem jedem Projekt ein eigener Ordner in einem Verzeichnis namens Source zugewiesen wird, das mit dem Programm geliefert werden soll. Das Erstellungsverzeichnis der ausführbaren Datei besteht aus zwei Verzeichnissen, die vom eigenen Quellcode rückwärts erstellt wurden, sodass sich das ausführbare Verzeichnis und der Quellordner im selben Verzeichnis befinden. Die Bibliotheken werden auch im selben Verzeichnis wie die ausführbare Datei erstellt, daher übergebe ich natürlich den Namen der Bibliothek Ich versuche wie folgt zu öffnen:

int main(int argc, char** argv) {
    void* hLibrary = dlopen("libLibrary.so", RTLD_NOW | RTLD_GLOBAL);
    if(hLibrary == NULL) {
        fprintf(stderr, "%s\n", dlerror());
        return 1;
    }

    return 0;
}

Dies funktionierte an einem Punkt, an dem das Erstellungsverzeichnis mit dem Quellcode identisch war, bis ich die Verzeichnisse des Quellcodes auf die oben beschriebene Anordnung änderte. Das Problem an dieser Stelle ist, dass dlerror () "libLibrary.so kann nicht geöffnet werden: keine solche Datei oder kein solches Verzeichnis" zurückgibt, obwohl die Datei eindeutig vorhanden ist und sich im selben Verzeichnis wie die ausführbare Datei befindet. Ich habe dann versucht, stattdessen "/libLibrary.so" einzugeben, da das Hinzufügen eines / ein relatives Verzeichnis angibt, wie in der Manpage zu dlopen (3) angegeben. Dies gab den gleichen Fehler zurück.

Die Lösung dafür war, dass ein "./" benötigt wurde - wo "." stellt das Arbeitsverzeichnis der ausführbaren Datei dar - und das Arbeitsverzeichnis musste in Code :: Blocks dahin geändert werden, wo die ausführbare Datei erstellt werden sollte. Folgendes funktioniert perfekt:

void* hLibrary = dlopen("./libLibrary.so", RTLD_NOW | RTLD_GLOBAL);

Dies zeigt nicht wirklich die vollständige Lösung, aber das Folgende entspricht im Grunde dem, was ich tue:

void* hLibrary = dlopen("./../../libLibrary.so", RTLD_NOW | RTLD_GLOBAL);

Hoffentlich erklärt dies die Situation ein wenig besser.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage