Wie kann ich es loswerden LD_LIBRARY_PATH zur Laufzeit?
Baue ich eine C++ - Anwendung, die verwendet Intel IPP Bibliothek. Diese Bibliothek wird standardmäßig installiert in /opt und erfordert, dass Sie eingestellt LD_LIBRARY_PATH
sowohl für die Erstellung und für den Betrieb Ihrer software (wenn Sie die shared-Bibliothek verknüpfen, was ich auch Tat). Ich habe bereits meine modifizierten configure.ac
/Makefile.am
so dass ich nicht brauchen, um festzulegen, dass die variable beim kompilieren, aber ich kann immer noch nicht finden, die shared library zur Laufzeit; wie mache ich das?
Ich kompiliere mit der -Wl, -R/path/to/libdir
Flagge mit g++
Update 1:
Eigentlich meine binäre Programm hat einige IPP-Bibliotheken korrekt verbunden, aber nur einer ist nicht:
$ ldd myprogram
linux-vdso.so.1 => (0x00007fffa93ff000)
libippacem64t.so.6.0 => /opt/intel/ipp/6.0.2.076/em64t/sharedlib/libippacem64t.so.6.0 (0x00007f22c2fa3000)
libippsem64t.so.6.0 => /opt/intel/ipp/6.0.2.076/em64t/sharedlib/libippsem64t.so.6.0 (0x00007f22c2d20000)
libippcoreem64t.so.6.0 => /opt/intel/ipp/6.0.2.076/em64t/sharedlib/libippcoreem64t.so.6.0 (0x00007f22c2c14000)
[...]
libiomp5.so => not found
libiomp5.so => not found
libiomp5.so => not found
Natürlich die Bibliothek ist es:
$ locate libiomp5.so
/opt/intel/ipp/6.0.2.076/em64t/sharedlib/libiomp5.so
- Ich könnte zu ändern brauchen die Frage auf etwas anderes, aber ich brauche Vorschläge, bin ich kurz auf Ideen
- Hm, ich Frage mich, ob es Zufall ist, dass einem das auch fehlt die Versionsnummer eine Erweiterung - vielleicht IPP ist nicht nur die Installation selbst Recht?
- Ich Frage mich, ob Sie die vergessene Bibliothek ist nicht verwiesen Ihr Programm, sondern durch die Bibliotheken, die Ihre Referenzen?
- das ist ein wirklich guter Gedanke. Sie könnte möglicherweise kompilieren IPP (oder andere IPP-abhängigen Bibliotheken) mit LD_RUN_PATH oder richtige linker-Optionen.
- Sie sind wahrscheinlich Recht, ich erinnere mich gelesen zu haben, dass so etwas wie und libiomp5.so ist ein threading-Bibliothek von Intel (IIRC Teil der MKL). Das Problem ist, dass ich nicht neu kompilieren, IPP, weil Sie nicht mit dem OSS...
- Sollten Sie absolut nicht ändern Sie Ihre app konfigurieren.ac/Makefile.bin zu reflektieren, die nicht-standard-Speicherort der Bibliothek. Verwenden Sie stattdessen eine CONFIG_SITE Datei zum setzen von LD_LIBRARY_PATH für Sie unter konfigurieren der Zeit (oder einfach in der Umgebung der login-shell, das löst das Laufzeit-problem).
- Der Pfad wird erweitert durch Variablen festlegen von benutzerdefinierten m4-Makros, suchen für die Bibliothek. Es gibt keine "festen" Weg in meiner Konfiguration.ac
Du musst angemeldet sein, um einen Kommentar abzugeben.
Durch
/path/to/lib
meinst du den Pfad zu dem Verzeichnis mit der Bibliothek oder den Pfad zur eigentlichen Datei?Den
-R
option gegeben, ein Verzeichnis argument wird behandelt wie-rpath
von ld, die ist die option, die Sie eigentlich sind, hier. Es fügt das angegebene Verzeichnis, um die runtime-library-search-path. Das sollte funktionieren, solange Sie geben Sie das Verzeichnis und nicht mit dem Namen. Ich bin ziemlich zuversichtlich, dass Sie, nachdem es selbst getan, und weil es eines der die Hinweise gegeben, die von libtool:(Ich füge dies hier, da unter Umständen eine der anderen Optionen könnte mehr wünschenswert - zum Beispiel LD_RUN_PATH speichern können Sie die makefile-änderungen)
make clean && make
sicher zu sein, habe ich aktualisiert die Binärdateien...LD_RUN_PATH
route, nur für den Fall?Wie vorgeschlagen durch Richard Pennington, die fehlende Bibliothek nicht direkt von meiner Anwendung, aber es wird von der freigegebenen Bibliotheken, die ich benutze. Da kann ich nicht kompilieren IPP die Lösung zu meinem problem ist das hinzufügen
-liomp5
bei der Erhebung, bei der Nutzung der option-R für den linker. Dies fügt tatsächlich die rpath für libiomp5.so das problem zu lösen!Können Sie überprüfen, ob der Pfad zur Bibliothek wird abgeholt von Ihrem
-R
Flagge durch ausführen derldd
Befehl oder diereadelf
Befehl auf Ihrem binäre. DieLD_LIBRARY_PATH
Umgebungsvariable ist ein override, also das sollte nicht notwendig sein in der Regel.Sollten Sie die -R option, wenn möglich.
Wenn nicht, benennen Sie die ausführbare Datei, und erstellen Sie ein Start-Skript, das ausgeführt wird in die ausführbare Datei, und dort setzen Sie den LD_LIBRARY_PATH nur für diesen Bereich.
Je nach Plattform, die Sie ändern können ld.so.conf durch /etc/ld.so.conf.d (Redhat/Fedora in den Sinn kommen), die Bereitstellung von änderungen zu ld.so "einfacher" aus ein Einsatz-Szenario.
-R
option; das problem ist, dass es nicht so funktioniert wie erwartet. Und ändern ld.so.conf ist wie das setzen von LD_LIBRARY_PATH, außer noch schlimmer - es gilt für alles, immer, nicht nur dieses Programm, und die Bereitstellung in einer Weise, die erfordert immer root ist nicht einfacher.Neben all den Tipps hier gepostet.. du bist nicht versuchen, eine 64-bit-spezifischen Bibliothek, die auf einem 32-bit system (oder Umgekehrt, je nach den anderen Bedingungen), sind Sie?
bash:
tcsh:
Versuchen Sie die Konfiguration Ihres
ldconfig
durchld.so.conf
so sucht er Ihre/opt/...
- Verzeichnis standardmäßig.