Более простой способ загрузки общих библиотек без рута - PullRequest
0 голосов
/ 30 марта 2019

Я пытаюсь скомпилировать и запустить программу C ++ на сервере, где у меня нет прав root.У меня проблемы с подключением библиотеки boost_iostreams.

Я могу успешно скомпилировать свою программу, указав на каталог для установки буста, используя флаг -L как: g++ -I path/to/boost/build/include -o out prog1.cpp prog2.cpp -L path/to/boost/build/lib -lboost_iostreams

Однако, если я запускаю программу как ./out, я получаюошибка error while loading shared libraries: libboost_iostreams.so.1.67.0: cannot open shared object file: No such file or directory, поскольку компоновщик не может найти libboost_iostreams.so.1.67.0 (который существует в path/to/boost/build/lib)

Благодаря этому ответу я смог явно указать LD_LIBRARY_PATHи запустите программу как

LD_LIBRARY_PATH="path/to/boost/build/lib" ./out.

Поскольку я не являюсь пользователем root, я также не могу запустить ldconfig.Мне было интересно, есть ли способ загрузки динамических библиотек без префикса LD_LIBRARY_PATH при запуске программы и отсутствии корневого доступа.

1 Ответ

0 голосов
/ 30 марта 2019

Я нашел способ решить эту проблему, используя метод, описанный здесь https://amir.rachum.com/blog/2016/09/17/shared-libraries/. Решение заключается в использовании rpath во время компиляции.

Согласно статье Единственная разница между rpath и runpath - это порядок, в котором они ищут. В частности, их отношение к LD_LIBRARY_PATH - rpath ищется ранее LD_LIBRARY_PATH при поиске runpath после. Значение это то, что rpath не может быть динамически изменен с окружающей средой переменные пока runpath могут.

Короче говоря, после компиляции с -rpath path/to/boost/build/lib каталог, содержащий библиотеку libboost_iostreams.so.1.67.0, ищется во время выполнения без префикса LD_LIBRARY_PATH="path/to/boost/build/lib" ./out.

После компиляции с g++ -I path/to/boost/build/include -o out prog1.cpp prog2.cpp -L path/to/boost/build/lib -lboost_iostreams -rpath path/to/boost/build/lib

Я смог запустить ./out без проблем.

РЕДАКТИРОВАТЬ 1

Как отметил Никос в комментариях, вы можете установить LD_LIBRARY_PATH на export LD_LIBRARY_PATH=path/to/boost/build/lib. Добавьте эту строку в файл .~/.bashrc, чтобы она не терялась при выходе из системы.

...