Развертывание игры для Linux, разделяемые библиотеки / зависимости

#linux #sdl

#linux #sdl

Вопрос:

У меня есть кроссплатформенное приложение (игра). Он использует библиотеку SDL. Я не могу связать ее статически из-за лицензии LGPL. В Windows я связываю DLL-файл, в Mac OSX я связываю каталог Frameworks. Но как это можно решить в GNU / Linux? Если в системе пользователя не установлены библиотеки SDL, возникает ошибка:

ошибка при загрузке общих библиотек: libSDL-1.2.so.0: не удается открыть общий объектный файл: нет такого файла или каталога

Даже если я связываю файл .so, система, похоже, не использует его.

Другая проблема заключается в том, что я не хочу принудительно переопределять пользовательские библиотеки. SDL — это не проблема, но, например, библиотеки OpenAL сильно различаются, и у пользователя могут быть работающие библиотеки OpenAL, в то время как моя может выйти из строя на его компьютере.

Комментарии:

1. Куда вы размещаете .so файлы? Система найдет их, только если они указаны в пути поиска.

2. В том же каталоге, что и исполняемый файл. Я не хочу ничего устанавливать в system path, потому что я не хочу требовать root-доступа.

Ответ №1:

По умолчанию Linux не выполняет поиск ни в текущем каталоге, ни в каталоге, из которого запускается двоичный файл. Если вам нужен простой подход, сделайте это:

 $> LD_PRELOAD=/path/to/your.so programName
  

Правильный подход заключается в установке LD_LIBRARY_PATH переменной окружения, которая представляет собой список путей поиска, разделенный двоеточием. Добавьте путь к вашим библиотекам в этот список.

 $> export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/path/to/your/libs"
$> programName
  

Если вы действительно хотите проявить творческий подход, ваш двоичный файл действительно может содержать собственный путь поиска, если вы правильно его настроите:

http://www.eyrie.org/~eagle/notes/rpath.html

Ответ №2:

Также есть $ORIGIN.

Ответ №3:

Это решение зависит от того, какой именно дистрибутив Linux вы используете (точнее, какой менеджер пакетов), но я думаю, что это «самое чистое» решение вашей проблемы:

Создайте пакет, содержащий ваше приложение (в Ubuntu или Debian это был бы пакет .deb для использования с apt). Таким образом, вы можете установить зависимости от разделяемых библиотек. Вам не придется самостоятельно развертывать SDL / OpenAL, и если эти пакеты выпущены в более новых версиях, вам не придется обновлять свой собственный пакет. Таким образом, ваше приложение будет намного меньше и его будет проще распространять, и если SDL / OpenAL отсутствуют в целевой системе, они будут установлены. Недостатком является то, что ваше приложение не является автономным.

Комментарии:

1. На самом деле это очень разумный ответ. Хотя я не хочу предполагать какой-либо конкретный дистрибутив, наличие не только заархивированного двоичного файла, но и пакета .deb было бы очень полезно для пользователей Ubuntu / Debian — и я думаю, что эти дистрибутивы являются одними из самых популярных.

2. @John: Я рекомендую ознакомиться с ресурсами Ubuntu о том, как это сделать: ссылка . Это довольно сложное чтение, но некоторые его части можно упростить (например, используя CDBS для установки правил). Некоторые системы make, такие как CMake или qmake , имеют дополнительные инструменты, которые упрощают этот процесс. Также может быть хорошей идеей создать пакет .deb с помощью pbuilder. Таким образом, вы гарантируете, что пакет будет работать в другой системе (что все зависимости правильно определены в .deb)