Приоритет LD_LIBRARY_PATH и проблемы с компиляцией

Я пытаюсь установить некоторое программное обеспечение на машину с Linux (пакет rpy2 для Python, в частности, rpy2.robjects, если это имеет значение). Мне нужно, чтобы программное обеспечение искало общие библиотеки в моем локальном пространстве, а не в глобальных пространствах, таких как /usr/lib64. У меня нет прав администратора на этой машине. Моя проблема в том, что, хотя я установил LD_LIBRARY_PATH для указания на мое локальное пространство, программное обеспечение все равно переходит в /usr/lib64/независимо, где оно находит устаревшие библиотеки. В этих библиотеках отсутствуют некоторые необходимые объекты, поэтому они не работают. Что может иметь приоритет над LD_LIBRARY_PATH, и есть ли способ изменить/избавиться от этого? Спасибо.

Кстати, у кого-то на этом сайте был аналогичный вопрос год или больше назад, но его ответ касался переменной env RPATH и ее изменения с помощью утилиты chrpath. Мне вообще непонятно, что rpy2 использует RPATH, а chrpath кажется недоступным в моей системе.

Приложение: я пробовал работать с LD_DEBUG=libs. Получил много вывода, который выглядит так, как будто система ищет библиотеки в моем LD_LIBRARY_PATH и находит их. Вот где, кажется, начинаются проблемы:

/usr/local/lib64/R/library/methods/libs/methods.so: error: symbol lookup error:
undefined symbol: Rf_allocS4Object (fatal)
Error in dyn.load(file, DLLpath = DLLpath, ...) : 
unable to load shared object '/usr/local/lib64/R/library/methods/libs/methods.so':
/usr/local/lib64/R/library/methods/libs/methods.so: undefined symbol: Rf_allocS4Object

Итак, я предполагаю, что проблема в том, что все, что находится в DLLpath, переопределяет LD_LIBRARY_PATH. Я попытался изменить это, добавив свои каталоги в os.environ['PATH'], но не смог. По-видимому, нет «DLLPATH», как я думал.

Ладно, это прогресс, я думаю. У кого-нибудь есть что-нибудь еще? Спасибо.


person bob.sacamento    schedule 25.07.2012    source источник


Ответы (4)


Взгляните на файл с именем $R_HOME/etc/ldpaths (где в вашем случае $R_HOME кажется /usr/local/lib64/R). Именно команды в этом файле устанавливают LD_LIBRARY_PATH при запуске R.

Мой выглядит так:

flodel@netbook-samsung-N150:~$ cat /usr/lib/R/etc/ldpaths 
: ${JAVA_HOME=/usr/lib/jvm/java-6-openjdk/jre}
: ${R_JAVA_LD_LIBRARY_PATH=${JAVA_HOME}/lib/i386/client:${JAVA_HOME}/lib/i386:/usr/lib/jni}
if test -n ""; then
: ${R_LD_LIBRARY_PATH=${R_HOME}/lib:}
else
: ${R_LD_LIBRARY_PATH=${R_HOME}/lib}
fi
if test -n "${R_JAVA_LD_LIBRARY_PATH}"; then
  R_LD_LIBRARY_PATH="${R_LD_LIBRARY_PATH}:${R_JAVA_LD_LIBRARY_PATH}"
fi
if test -z "${LD_LIBRARY_PATH}"; then
  LD_LIBRARY_PATH="${R_LD_LIBRARY_PATH}"
else
  LD_LIBRARY_PATH="${R_LD_LIBRARY_PATH}:${LD_LIBRARY_PATH}"
fi
export LD_LIBRARY_PATH

Если у вас нет прав на запись в файл, вы все равно можете сделать это перед запуском R:

export R_LD_LIBRARY_PATH=/your/custom/path

Я проверил на своей машине, что он работает, выполнив следующее после запуска R:

Sys.getenv("LD_LIBRARY_PATH")
#[1] "/your/custom/path:/usr/lib/jvm/java-6-openjdk/jre/lib/i386/client:/usr/lib/jvm/java-6-openjdk/jre/lib/i386:/usr/lib/jni"
person flodel    schedule 25.07.2012
comment
Придется уйти и отсутствовать на рабочем месте пару дней, поэтому сейчас не могу попробовать что-то еще. Но спасибо всем за помощь! - person bob.sacamento; 26.07.2012
comment
flodel, если вы или кто-то еще читаете здесь, я попытался установить R_LD_LIBRARY_PATH. Кажется, это сработало при настройке LD_LIBRARY_PATH, но поведение, которое я получаю, когда пытаюсь добраться до R через rpy2, остается таким же, как и выше. python/rpy2 просто не откажется от старых библиотек. Любые другие мысли приветствуются. Кстати, чтобы посмотреть значение LD_LIBRARY_PATH, мне пришлось использовать os.getenv(), а не Sys.getenv(). Я делаю что-то неправильно? - person bob.sacamento; 31.07.2012

Если кто-то это еще читает, то я занялся неким "кадровым инжинирингом" для решения проблемы, т.е. заставил сисадминов переустановить R, чтобы в нем было все, что мне нужно. Было, конечно, мило с их стороны. Большое спасибо всем, кто дал предложения. Я хотел бы продолжить некоторые из них, но я должен быть занят этим проектом. Весьма признателен!

person bob.sacamento    schedule 31.07.2012

RPATH полезен только при компиляции (ну, линковке); это влияет на путь поиска библиотеки, который запекается в двоичном файле.

Попробуйте запустить с LD_DEBUG=libs, который покажет, по каким путям загружаются библиотеки. Пытается ли он загрузиться из вашего LD_LIBRARY_PATH, но терпит неудачу, или вообще не ищет там (возможно, rpy2 имеет свой собственный механизм пути к библиотеке?), или что-то еще?

person ephemient    schedule 25.07.2012
comment
Нет-нет, RPATH полезен и при беге. - person ; 26.07.2012
comment
@VladLazarenko Как так? man ld.so документирует свой путь поиска библиотеки времени выполнения, а именно: DT_RPATH в двоичном файле, LD_LIBRARY_PATH в среде, DT_RUNPATH в двоичном файле, в ld.so.cache (обычно построенном на основе ld.so.conf) и в стандартных расположениях библиотек. RPATH в среде не используется. - person ephemient; 26.07.2012
comment
Хорошо, я попробовал LD_DEBUG. Очень полезный инструмент, о котором я не знал. Вот фрагмент вывода: - person bob.sacamento; 26.07.2012
comment
Хорошо, если вы не возражаете, я внесу вывод в редактирование моего вопроса. Это нечитабельно как комментарий. - person bob.sacamento; 26.07.2012

Попробуйте добавить свой каталог слева от LD_LIBRARY_PATH, поскольку приоритет идет слева направо.

export LD_LIBRARY_PATH=~/your/custom/path:$LD_LIBRARY_PATH
person Meitham    schedule 25.07.2012
comment
Большое спасибо, но я все еще получаю ту же проблему. - person bob.sacamento; 26.07.2012