Редактировать: я решил эту проблему, решение ниже.Почему я не могу переопределить путь поиска динамических библиотек с помощью LD_LIBRARY_PATH?
Я создаю код в общем вычислительном кластере, предназначенный для научных вычислений, поэтому я могу управлять файлами только в своей домашней папке. Хотя я использую fftw в качестве примера, я хотел бы понять конкретную причину, почему моя попытка настроить LD_LIBRARY_PATH не работает.
Я построить FFTW и fftw_mpi библиотеки в моей домашней папке, как этот
./configure --prefix=$HOME/install/fftw --enable-mpi --enable-shared
make install
Она строит хорошо, но в установке/FFTW/LIB, я считаю, что недавно построенный libfftw3_mpi.so ссылки на неправильную версию библиотека fftw.
$ ldd libfftw3_mpi.so |grep fftw
libfftw3.so.3 => /usr/lib64/libfftw3.so.3 (0x00007f7df0979000)
Если теперь я пытаюсь установить LD_LIBRARY_PATH правильно, указывающий на этот каталог, он по-прежнему предпочитает неправильную библиотеку:
$ export LD_LIBRARY_PATH=$HOME/install/fftw/lib
$ ldd libfftw3_mpi.so |grep fftw
libfftw3.so.3 => /usr/lib64/libfftw3.so.3 (0x00007f32b4794000)
Только если я явно использовать LD_PRELOAD, я могу переопределить это поведение. Я не думаю, что LD_PRELOAD - это правильное решение.
$ export LD_PRELOAD=$HOME/install/fftw/lib/libfftw3.so.3
$ ldd libfftw3_mpi.so |grep fftw
$HOME/install/fftw/lib/libfftw3.so.3 (0x00007f5ca3d14000)
Вот что я бы ожидал, небольшой тест сделано в настольных Ubuntu, где я установил FFTW в/USR/Lib, а затем переопределить этот путь поиска LD_LIBRARY_PATH.
$ export LD_LIBRARY_PATH=
$ ldd q0test_mpi |grep fftw3
libfftw3.so.3 => /usr/lib/x86_64-linux-gnu/libfftw3.so.3
$ export LD_LIBRARY_PATH=$HOME/install/fftw-3.3.4/lib
$ ldd q0test_mpi |grep fftw3
libfftw3.so.3 => $HOME/install/fftw-3.3.4/lib/libfftw3.so.3
Вкратце: почему библиотека libfft3_mpi все еще находит неправильную динамическую библиотеку fftw3? Где этот путь поиска жестко закодирован таким образом, что он имеет приоритет над LD_LIBARY_PATH? Почему это не так на другом компьютере?
Я использую интеллектуальные компиляторы 13.1.2, mkl 11.0.4.183 и openmpi 1.6.2, если это имеет значение.
Редактировать: Спасибо за все ответы. С помощью этих средств мы смогли изолировать проблему до RPATH, и оттуда поддержка кластера смогла выяснить проблему. Я принял первый ответ, но оба ответа были хорошими.
Причина, по которой так трудно понять, заключается в том, что мы не знали, что компиляторы на самом деле являются обертковыми сценариями, добавляя их в командную строку компилятора. Здесь часть ответа от поддержки:
[The] компиляция проходит через нашу оболочку компилятора. Мы делаем RPATH-ing по умолчанию, так как он помогает большинству пользователей правильно выполнять свои задания без загрузки LD-LIBRARY_PATH и т. Д. Однако мы исключаем определенные пути библиотеки от RPATH по умолчанию, который включает в себя/lib,/lib64/proj /home и т. Д. Раньше/usr/lib64 не был исключен по ошибке (в основном). Теперь мы добавили этот путь в список исключений.
Действительно, с readelf кажется, что действительно/usr/lib64 находится перед/home/USER/install/fftw/lib в переменной RPATH. Теперь проблема остается, что как/usr/lib64 добрался до/fftw/lib. '$ readelf -d libfftw3_mpi.so | grep RPATH 0x000000000000000f (RPATH) Библиотека rpath: [/software/intel/composer_xe_2013.4.183/compiler/lib/intel64:/usr/lib:/usr/lib/gcc/x86_64-redhat-linux/4.4.4:/usr/lib64:/home/USER/install/fftw/lib] ' –
rpath добавляется во время компиляции. Я не знаю fftw lib, но, возможно, существует флаг '--disable-rpath' configure. Чтобы изменить rpath, вы можете использовать 'chrpath -r' для изменения rpath в библиотеке –
bonoparte