Как мне избавиться от LD_LIBRARY_PATH во время выполнения? - PullRequest
10 голосов
/ 20 марта 2010

Я создаю приложение на C ++, которое использует библиотеку Intel IPP . Эта библиотека по умолчанию устанавливается в / opt и требует, чтобы вы установили LD_LIBRARY_PATH как для компиляции, так и для запуска вашего программного обеспечения (если вы выбрали связывание с общей библиотекой, что я и сделал). Я уже изменил свой configure.ac / Makefile.am, так что мне не нужно устанавливать эту переменную при компиляции, но я все еще не могу найти общую библиотеку во время выполнения; как мне это сделать?

Я компилирую с флагом -Wl, -R/path/to/libdir, используя g++

Обновление 1 : На самом деле моя бинарная программа имеет правильно подключенные библиотеки IPP, но только одна из них:

$ 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

Конечно, библиотека есть:

$ locate libiomp5.so
/opt/intel/ipp/6.0.2.076/em64t/sharedlib/libiomp5.so

Ответы [ 7 ]

5 голосов
/ 20 марта 2010

Под /path/to/lib вы подразумеваете путь к каталогу, содержащему библиотеку, или путь к реальному файлу?

Опция -R, заданная в качестве аргумента каталога, обрабатывается как -rpath с помощью ld, и эта опция на самом деле вам нужна. Добавляет данный каталог в путь поиска библиотеки времени выполнения. Это должно работать, пока вы даете ему каталог, а не имя файла. Я довольно уверен в этом, сделав это сам, и потому что это один из советов, данных libtool:

Библиотеки установлены в:

/ путь / к / библиотека-каталог

Если вам когда-нибудь захочется установить связь с установленными библиотеками в данном каталоге, LIBDIR, вы должны либо использовать libtool, и укажите полный путь к библиотеке или используйте `-LLIBDIR ' пометить во время связывания и выполнить хотя бы одно из следующих действий:

  • добавить LIBDIR в переменную окружения `LD_LIBRARY_PATH ' во время исполнения
  • добавить LIBDIR в переменную окружения `LD_RUN_PATH ' при связывании
  • использовать флаг компоновщика `-Wl, -rpath -Wl, LIBDIR '
  • попросите вашего системного администратора добавить LIBDIR в `/etc/ld.so.conf'

(я вставляю это сюда, поскольку, возможно, один из других вариантов может быть более желательным - например, LD_RUN_PATH может сохранить вашу модификацию make-файла)

2 голосов
/ 22 марта 2010

Как предположил Ричард Пеннингтон, отсутствующая библиотека не используется непосредственно моим приложением, но используется общими библиотеками, которые я использую.Поскольку я не могу перекомпилировать IPP, решением моей проблемы является добавление -liomp5 при компиляции, используя опцию -R для компоновщика.Это фактически добавляет rpath для libiomp5.so для решения проблемы!

2 голосов
/ 20 марта 2010

Вы можете проверить, выбирается ли путь к библиотеке из вашего флага -R, выполнив команду ldd или readelf в вашем двоичном файле. Переменная окружения LD_LIBRARY_PATH является переопределением, поэтому обычно не требуется.

0 голосов
/ 21 марта 2010

Помимо всех полезных советов, опубликованных здесь ... вы не пытаетесь использовать 64-битную библиотеку в 32-битной системе (или наоборот, в зависимости от других условий), не так ли?

0 голосов
/ 20 марта 2010

Вы должны использовать опцию -R, если это возможно.

Если нет, переименуйте ваш исполняемый файл и создайте сценарий запуска, который запускает ваш исполняемый файл, и там установите LD_LIBRARY_PATH только для этой области.

В зависимости от платформы вы можете изменить ld.so.conf через /etc/ld.so.conf.d (на ум приходит Redhat / Fedora), что упрощает развертывание изменений в ld.so из сценария развертывания.

0 голосов
/ 20 марта 2010

Попробуйте настроить ldconfig - ld.so.conf, чтобы он по умолчанию выполнял поиск в каталоге /opt/....

0 голосов
/ 20 марта 2010

Баш:

export LD_LIBRARY_PATH=/path/to/lib

Tcsh:

setenv LD_LIBRARY_PATH /path/to/lib
...