Как заставить Boost использовать rpath?
Я должен построить Boost за пределами "обычного" дерева каталогов (т.е. /custom/dir
вместо /usr
), что не так уж много проблем: просто пройти --prefix=/custom/path
в ./runscript.sh
/ ./bjam
и там вы идете.
Или я так думал.
Проблема в том, что некоторые библиотеки Boost зависят друг от друга, и - при использовании процесса сборки по умолчанию ./bootstrap.sh
/ ./bjam
- кажется, что --prefix
путь не добавляется в путь поиска библиотеки для библиотек Boost, т.е. нет -Wl,-rpath
применены. Это означает, что библиотеки Boost, зависящие от других библиотек Boost, не могут найти их во время выполнения.
Мое приложение - связывание тех /custom/path
Повысить библиотеки - уже не удается в ./configure
этап, потому что libboost_filesystem.so
не могу найти libboost_system.so
хотя я прошел -Wl,-rpath=/custom/path/boost/lib
на мою собственную строку компилятора (т.е. правильный путь к библиотекам Boost, я дважды проверил, что libboost_system.so
есть).
Теперь, чтобы избежать жестких методов, таких как установка LD_LIBRARY_PATH
Я хотел бы собрать Boost таким образом, чтобы все библиотеки Boost имели правильный путь поиска для других скомпилированных библиотек Boost. Однако я не смог найти подходящую процедуру для этого. Кто-нибудь может мне помочь?
2 ответа
Вы можете добавить параметры компилятора и ссылки во время сборки из командной строки:
bjam hard-code-dll-path=true dll-path=/custom/path
Об этом есть документ с часто задаваемыми вопросами в Boost Build (см. Документацию B2).
Мне нужно было сделать это недавно для другого проекта, хотя мне нужно было использовать $ORIGIN, чтобы указать путь относительно расположения общих объектов boost.
Для этого в командной строке bash необходимо следующее:
./b2 hardcode-dll-paths=true dll-path="'\$ORIGIN/../lib'" --prefix=$MY_PREFIX install
Выяснение волшебной коллекции символов для правильного размещения $ORIGIN в совместно используемом объекте потребовало небольшого количества проб и ошибок, поэтому я надеюсь, что написание ответа здесь поможет другим избежать этой проблемы.