%20Version%20der%20Bibliothek%20verwendet%20wird%3F.png)
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 Y
ist in installiert /usr/lib64
. Ich möchte eine Verknüpfung mit so
den 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 gcc
mit der Version kompiliert wird .X
Im Moment lege ich LIBRARY_NAME_DIR
die 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_PATH
scheint zu sein, dass jede gegebene -L
Option Vorrang hat. Wenn der gcc
Befehl 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/lib64
nicht 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_PATH
Variable 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_PATH
vom 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 -rpath
wie LIBRARY_PATH
für -rpath
, außer dass die Angabe von -rpath
bedeutet, dass LIBRARY_PATH
ignoriert 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, gcc
das 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 make
Folgendes ausführen:
PATH=/path/to/script:$PATH make