#c #linux #bash #g #shared-libraries
#c #linux #bash #g #общие библиотеки
Вопрос:
Я относительно новичок в разработке Linux, уже некоторое время использую Windows. В любом случае, я компилирую игру на C , используя g как для Windows, так и для Linux (при необходимости используя mingw32), и я связываюсь с SDL2 и SDL2_mixer. В Windows нужно было бы только поместить файлы DLL в ту же папку, что и исполняемый файл, и все будет работать нормально. Однако в Linux, хотя код скомпилирован просто отлично, без единого предупреждения, я получаю это во время выполнения :
./nKaruga: error while loading shared libraries: libSDL2_mixer-2.0.so.0: cannot open shared object file: No such file or directory
хотя указанная общая библиотека находится в той же папке. Я просмотрел несколько похожих случаев в Stack Overflow, все они связаны с использованием LD_LIBRARY_PATH
, и попробовал, но безрезультатно.
% LD_LIBRARY_PATH=pwd
% export LD_LIBRARY_PATH
% ./nKaruga
./nKaruga: error while loading shared libraries: libSDL2_mixer-2.0.so.0: cannot open shared object file: No such file or directory
Я хочу распространять эту программу в системах, которые не обязательно имеют права администратора для установки зависимостей, поэтому я помещаю SO в ту же папку, что и исполняемый файл.
Заранее спасибо!
Комментарии:
1.
pwd
должно быть`pwd`
.2. в следующий раз — «echo $ LD_LIBRARY_PATH» — это ваша строка отладки
Ответ №1:
LD_LIBRARY_PATH — это быстрый одноранговый хак для указания альтернативных путей поиска загрузки библиотеки. Более постоянным и более чистым решением является указание конкретных наборов путей, по которым следует искать библиотеки, специфичные для вашего конкретного двоичного файла. Это называется rpath (статья в Википедии об этом: https://en.wikipedia.org/wiki/Rpath ). Существует ряд «переменных», которые могут быть указаны в двоичном rpath, которые заменяются. В вашем случае переменная rpath ${ORIGIN}
была бы наиболее интересной для вас. ${ORIGIN}
сообщает динамическому компоновщику искать библиотеки в том же каталоге, в котором также находится двоичный файл.
Rpath может быть установлен во время соединения с опцией -rpath
компоновщика, т. Е. При вызове через GCC опция будет -Wl,-rpath='${ORIGIN}'
, т.е.
gcc -o program_binary -Wl,-rpath='${ORIGIN}' -lSDL2_mixer a.o b.o …
Для существующего двоичного файла rpath можно задать post-hoc с помощью chrpath
patchelf
инструментов or; однако лучше установить его во время соединения.