Einstellung der RPATH-Reihenfolge in QMake

8

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?

    
Mike Blackwell 09.12.2014, 16:54
quelle

4 Antworten

8

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.

    
Nejat 10.12.2014 04:12
quelle
1

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%     
Simon Warta 09.12.2014 21:33
quelle
0

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:

%Vor%

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.

    
Petesh 09.12.2014 17:52
quelle
0

qmake würde immer das QMAKE_RPATHDIR mit dem intern in QT_INSTALL_LIBS -Datei definierten $(QT_DIR)/mkspecs/features/qt.prf anhängen:

%Vor%

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.

    
CK Cheong 13.01.2017 08:46
quelle

Tags und Links