Wie konfiguriere ich meine Umgebung so, dass eine korrekte (von der Systemversion abweichende) Version der Bibliothek verwendet wird?

Wie konfiguriere ich meine Umgebung so, dass eine korrekte (von der Systemversion abweichende) Version der Bibliothek verwendet wird?

Ich vermute, dass diese Frage eine Grenze zwischen ServerFault und StackOverflow und dieser Site darstellt. Aber ich denke, dass U&L am relevantesten ist.

Ich habe C++Code, der von einer Bibliothek in Version abhängt X, und das System stellt die Version Y(X>Y) bereit. Ich habe diese Bibliothek kompiliert und die resultierenden Dateien in platziert /opt/lib_name/X/lib, die Version Yist in installiert /usr/lib64. Ich möchte eine Verknüpfung mit soden Bibliotheken herstellen.

Jetzt möchte ich ein Skript erstellen, das irgendwie die Version aktiviert X, sodass jeglicher Code, den ich erstelle, ohne Änderungen in den Makefiles gccmit der Version kompiliert wird .X

Im Moment lege ich LIBRARY_NAME_DIRdie Variable fest und füge im Makefile einfach an -L $LIBRARY_NAME_DIR, was funktioniert, aber erfordert, dass ich die Makefiles ändere.

Gibt es eine Möglichkeit, diese Dinge zu tun, ohne Root-Zugriff auf den Computer zu haben?

Hinweis: Ich glaube zwar nicht, dass die Antwort auf diese Frage von der jeweiligen Bibliothek oder dem Code abhängt, alle Einzelheiten zu meinem speziellen Problem finden Sie jedoch hier:https://stackoverflow.com/q/24189130/7918.

Was ich versucht habe:

  • Ich habe gesetzt: LIBRARY_PATH, LD_LIBRARY_PATH, CPLUS_INCLUDE_PATH.

Antwort1

Ich glaube nicht, dass es eine Möglichkeit gibt, dies robust nur mit Umgebungsvariablen zu tun. Das Problem bei der Verwendung LIBRARY_PATHscheint zu sein, dass jede gegebene -LOption Vorrang hat. Wenn der gccBefehl aus irgendeinem Grund hat -L/usr/lib64, wird zuerst nach diesem gesucht und die ältere Version der Bibliothek wird gefunden. Anscheinend werden Sie die Makefiles ändern, Sie sollten auch darauf achten, dass -L/usr/lib64nicht zuerst ein erscheint.

Wenn man sich jedoch Ihre SO-Frage ansieht, sieht es nicht so aus, als ob das oben genannte ein Problem wäre. :Der Wert Ihrer LIBRARY_PATHVariable weist jedoch einen unnötigen Nachspann auf, was erklären könnte, warum es nicht funktioniert hat.

Außerdem wird, wie in der Antwort auf die SO-Frage erwähnt, LD_LIBRARY_PATHvom dynamischen Linker verwendet und ist nur relevant beiLaufzeitfür Ihre Anwendung. Dies kann verwendet werden, wenn der Speicherort der dynamischen Bibliotheken beim Ausführen der Anwendung nicht gefunden werden kann. Der GNU-Linker verwendet LD_RUN_PATH, was im Wesentlichen für das Gleiche gilt -rpathwie LIBRARY_PATHfür -rpath, außer dass die Angabe von -rpathbedeutet, dass LIBRARY_PATHignoriert wird (und nicht nur eine niedrigere Priorität erhält).

Was Sie dann versuchen könnten, ist:

LIBRARY_PATH=/opt/lib_name/X/lib LD_RUN_PATH=/opt/lib_name/X/lib make

Robuster könnte es sein, ein Wrapper-Skript zu erstellen, gccdas die erforderlichen Optionen enthält, z. B.:

#!/bin/sh
gcc -L/opt/lib_name/X/lib -Wl,-rpath,/opt/lib_name/X/lib "$@"

Benennen Sie die Datei gcc, machen Sie sie ausführbar und legen Sie sie in einem eigenen Verzeichnis ab (oder zumindest in einem, in dem sich keine Dateien mit demselben Namen wie wichtige Befehle befinden). Dann können Sie makeFolgendes ausführen:

PATH=/path/to/script:$PATH make

verwandte Informationen