Linken einer dynamischen Library



  • Ich schreibe an einer größeren C++ Anwendung mit QT und habe ein Problem beim Linken, bei dem ich nicht mehr weiter weiß. Ich linke eine selbstgeschriebene Library, die während der Kompilierung auch gefunden wird, aber später beim Ausführen des Programms wieder fehlt.

    Im .pro füge ich die passenden -L und -l parameter an:
    LIBS += -L/home/foo/folder -ldb_connection, die auch beim kompilieren übernommen werden:

    g++ -m64 -Wl,-O1 -o med_recog main.o mainwindow.o (...) -lopencv_world -L/home/foo/folder -ldb_connection -lQtSql -lQtGui -lQtNetwork -lQtCore -lpthread

    Die Library wird auch gefunden, wenn ich ein -ldb_connectionBLAFASEL angebe, wird die Datei natürlich nicht gefunden und das Programm kompiliert nicht.

    Wenn ich mein Programm starten will, wird die Library aber nicht mehr gefunden:
    ./med_recog: error while loading shared libraries: libdb_connection.so.1: cannot open shared object file: No such file or directory

    und
    ldd med_recog | head
    linux-vdso.so.1 => (0x00007ffff35ff000)
    libopencv_world.so.2.4 => /usr/local/lib/libopencv_world.so.2.4 (0x00007f5a86c34000)
    libdb_connection.so.1 => not found

    Wie kann es denn sein, dass die Lib beim Kompilieren gefunden und benutzt wird, die Binary aber später nichts mehr davon wissen will?


  • Mod

    Mit -L//home/foo/folder gibst du an, dass beim Linken in diesem Pfad gesucht werden soll. Ich nehme mal an, in diesem Pfad liegt die Bibliothek?

    Zur Laufzeit sind die Parameter des Linkers natürlich längst vergessen, die Bibliotheken werden nicht gefunden.

    Abhilfen:
    1. einen runpath für dein Programm angeben. Beim GCC mit Schalter -Wl,-rpath /home/foo/folder/ . Dies ist eine passende Möglichkeit, wenn dein Programm davon abhängig sein darf, dass es die Bibliothek in genau diesem Ordner finden kann.
    2. Wenn du für dich selber Bibliotheken installiert hast, dann kannst (und solltest) du den Pfad dahin in deinen LD_LIBRARY_PATH aufnehmen.
    3. Wenn dies für alle Benutzer auf dem System gelten soll (eher unwahrscheinlich, wenn das in deinem home liegt), dann kannst du den Pfad zu den Bibliotheken in die Konfiguration des Runtimelinkers aufnehmen, meistens in /etc/ld.so.conf zu finden.



  • Hey!

    Vielen Dank für die schnelle Hilfe, ich habe es über den LD_Library_path gelöst.



  • ich kann dir nur empfehlen cmake zu benutzen. Besonders für größere Projekte mit mehreren shared libs sehr hilfreich und vereinfacht wirklich sehr viel.



  • Ich benutze aktuell QMake, da kann ich eine library auch recht einfach per

    LIBS += -L/home/foo/db_connection -ldb_connection

    einbinden lassen.


Anmelden zum Antworten