Исполняемый файл Linux не может найти общую библиотеку в той же папке

#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; однако лучше установить его во время соединения.