Начальная точка
Для определенного кода, который я получил для внутреннего использования, библиотеки должны быть скомпилированы с mpicxx, скажем, -lboost_filesystem
. Здания идут гладко, если я установлю
export LIBRARY_PATH=<boost lib directory>
export LD_LIBRARY_PATH=<boost lib directory>:$LD_LIBRARY_PATH
NB. Каталог библиотеки Boost находится в домашней сети, и это нельзя изменить.
Действие
Чтобы более аккуратно управлять библиотеками, я подумал о создании еще одного локального каталога ~/lib
, имеющего разрешения drwxr-xr-x
и содержащего символические ссылки на библиотеки определенных пакетов.
Содержимое этого хранилища: (ll ~\lib
)
lrwxrwxrwx 1 ... libboost_filesystem.a -> <boost lib directory>/libboost_filesystem.a*
lrwxrwxrwx 1 ... libboost_filesystem.so.1.62.0 -> <boost lib directory>/libboost_filesystem.so.1.62.0*
lrwxrwxrwx 1 ... libboost_filesystem.so@ -> <boost lib directory>/libboost_filesystem.so.1.62.0*
Ссылки содержат абсолютные пути и находятся в исправном состоянии.
Целевые файлы имеют разрешения 755.
Выпуск
Однако, если я собираю ту же программу с
export LIBRARY_PATH=<lib repository>
export LD_LIBRARY_PATH=<lib repository>:$LD_LIBRARY_PATH
компоновщик выдает ошибку перемещения и неправильного значения
/usr/bin/ld: ~/lib/../lib/libboost_filesystem.a(operations.o): relocation R_X86_64_PC32 against symbol `_ZN5boost6detail15sp_counted_base7destroyEv' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: Bad value
collect2: error: ld returned 1 exit status
Диагностика
Я приписал эту ошибку некоторой путанице, возникшей из LIBRARY_PATH, поскольку сборка успешно завершается, если я установил
export LIBRARY_PATH=<boost lib directory> # see Starting point
export LD_LIBRARY_PATH=<lib repository>:$LD_LIBRARY_PATH # see Action
Это игнорирует меня, потому что содержимое ~/lib
указывает на одинаковые элементы в библиотеках пакетов.
Я предполагал, что символические ссылки будут изящно разыменованы.
Введение символических ссылок сбивает с толку процессы компиляции.
Вопросы
Изолировал ли я реальный триггер этой проблемы?
Распознается ли эта ситуация?
Что может быть причиной путаницы?
Есть ли способ обойти это?