Ich habe ein Linux-Qt-Programm. Ich möchte, dass es vorzugsweise die (dynamischen) Qt-Bibliotheken im Verzeichnis der ausführbaren Datei verwendet, falls sie existieren, andernfalls verwende die Qt-Bibliotheken des Systems. RPATH zur Rettung.
Ich füge diese Zeile zur qmake .pro-Datei hinzu:
%Vor%und schaue auf die resultierende ausführbare Datei mit readelf Ich sehe:
%Vor%Scheint richtig, aber ldd zeigt an, dass es die Systemversion verwendet:
%Vor%Wenn ich qmakes resultierendes Makefile manuell bearbeite, um die Reihenfolge der zwei Pfade zu tauschen, so dass $ ORIGIN nach / usr / local / ... kommt, bekomme ich das richtige Verhalten:
%Vor%Mein Problem ist, wie qmake die letzte LFLAGS-Variable konstruiert. Ich kann nicht herausfinden, wie ich meine Addition ($ ORIGIN) hinter die Systembibliothek stellen kann. Irgendwelche Ideen?
Sie können Ihrer .pro-Datei Folgendes hinzufügen, um zu erzwingen, dass der dynamische Linker zur Laufzeit in Linux im selben Verzeichnis wie Ihre Qt-Anwendung aussieht:
%Vor%Wenn Sie in einem Unterverzeichnis des ausführbaren Pfades suchen möchten, können Sie verwenden:
%Vor% Beachten Sie, dass Sie die .so-Dateien mit dem exakt gleichen Namen in Ihrem Anwendungsverzeichnis haben sollten. Zum Beispiel sollten Sie libQt5Core.so.5.2.0
in Ihr Anwendungsverzeichnis mit dem Namen libQt5Core.so.5
kopieren. Jetzt zeigt die ldd das Verzeichnis der Anwendung.
Sie können auch libQt5Core.so.5.2.0
und eine Verknüpfung mit dem Namen libQt5Core.so.5
im Anwendungsverzeichnis haben.
Soweit meine Forschung sagen kann, können Sie RPATH nur am Anfang der Liste mit QMake hinzufügen.
Aber wenn Sie unter Linux sind und chrpath
installieren können, können Sie sich damit zurechtfinden.
Fügen Sie diesen Block am Ende Ihrer .pro-Datei hinzu
%Vor%Ich bin ein bisschen raten, was passiert ist, aber es basiert auf einige der seltsamen Verhaltensweisen von LD kennen.
Überprüfen Sie, ob eine Variable LD_LIBRARY_PATH
vor der Verarbeitung einer RUNPATH-Variablen vorhanden ist. Da sowohl RPATH
als auch RUNPATH
vorhanden sind, wird die LD_LIBRARY_PATH
-Regel wirksam. Wenn sie also gesetzt ist, wird sie aufgehoben.
Zweitens würde ich niemals erwarten zu sehen:
%Vor% in der Ausgabe von ldd
, ich würde immer die Erweiterung von $ORIGIN
auf das Verzeichnis der Binärdatei sehen (vielleicht hast du es gekürzt?), also hätte ich erwartet:
Was bedeutet, dass es so klingt, als wäre die LD_LIBRARY_PATH
Erweiterung .:/usr/local/Trolltech/Qt-5.2.0/lib
, was für mich klingt, als hätten Sie Umgebungsüberschreibungen.
qmake würde immer das QMAKE_RPATHDIR
mit dem intern in QT_INSTALL_LIBS
-Datei definierten $(QT_DIR)/mkspecs/features/qt.prf
anhängen:
Um zu vermeiden, dass Ihre Anwendung die Bibliothek QT
aus dem Systempfad verwendet, müssen Sie die Zeilen über denen die QMAKE_RPATHDIR
anhängen und QMAKE_RPATHDIR=$ORIGIN
in Ihre .pro
-Datei einfügen kommentieren.