Развертывание игры на C++ в Linux
Я инди-разработчик игр, работающий на платформе Windows, но у меня на самом деле мало опыта работы с Linux и развертывания приложений для него. Я полирую свою игру, написанную на C++ ' 11 на основе SDL 2.0 с несколькими другими кросс-платформенными зависимостями (например, AngelScript или PugiXML) в Windows, и я хочу распространить ее и на Linux, и у меня есть несколько вопросов об этом. Игра является коммерческой, с закрытым исходным кодом, который в настоящее время находится на GreenLite Steam, но я хочу распространять бесплатную альфа-версию загружаемые с моего сайта, независимо от статуса GreenLite.
1.) Совместимы ли основные дистрибутивы Linux ABI (application binary interface)? Или мне нужно скомпилировать свою игру на каждом поддерживаемом дистрибутиве / платформе?
2.) Если да, то какие дистрибутивы/платформы являются разумным выбором для поддержки?
3.) Каков наилучший способ установки приложения и его зависимости от Linux? Я читал о системах deb и rpm, но это все еще сбивает с толку - есть ли какие-либо способ автоматического создания установочных пакетов для различных дистрибутивов?
4.) Как работает Steam с Linux? Как подготовить приложение к распространению через него?
Извините, если я задаю неправильные вопросы, весь мир Linux довольно новый для меня, и я заблудился, читая различные статьи и страницы руководства...
3 ответов
Это зависит от того, из чего получено распределение. Как правило, нет необходимости перекомпилировать программу на что-то вроде Ubuntu в Fedora пока код остается неизменным. Поскольку Ubuntu и Fedora должны использовать одни и те же библиотеки (хотя, возможно, в разных местах), и все, что связано с OpenGL, будет проблемой драйвера; поэтому вряд ли требуется перекомпилировать ваше программное обеспечение. Я был бы крайне удивлен, если бы вам пришлось перекомпилировать поскольку все дистрибутивы используют практически один и тот же набор библиотек/got bash/используют ядро Linux, но имеют разные менеджеры пакетов. Последняя часть, где он становится сложным:
вышеупомянутые дистрибутивы имеют разные менеджеры пакетов, которые требуют, чтобы вы соответствующим образом переупаковали свое программное обеспечение. Вы можете выпустить предварительно скомпилированные двоичные файлы под tar.GZ файл и просто имеют distro maintainers пакет программного обеспечения для вас; хотя, если вы хотите контролировать, как ваш программное обеспечение распространяется тогда вам лучше сделать это самостоятельно. Из-за этой проблемы, связанной со многими менеджерами пакетов, люди все еще прибегают к перекомпиляции исходного кода через файл make, который может быть сгенерирован через cmake. Это происходит только в том случае, если определенные зависимости по какой-либо причине "переименованы", и в этом случае из-за простого изменения имени программа волшебным образом не находит зависимости. Поскольку также нет соглашения об именах, это даже усложняет жизнь. Самый важным достоинством здесь является доверие, и доверие к нему, чтобы разработчики следовали соглашениям об именах, чтобы каждый мог ссылаться на один и тот же пакет с тем же именем.
лучшие дистрибутивы для поддержки являются самыми популярными: Ubuntu и openSUSE были бы отличными отправными точками. Linux Mint, Fedora и Red Hat и Debian используют менеджеры пакетов аналогично вышесказанному.
- между тем, вы должны знать, что вы не можете статически связать под GPL код в свой программное обеспечение без также делает ваше программное обеспечение также GPL. Способ обойти это-разрешить зависимости либо: A. включая соответствующие зависимости в той же папке, что и исполняемый файл (так же, как *.DLL в Windows) или в зависимости от системы, на которой запускается ваша программа, чтобы заглянуть в те же каталоги, в которые заглядывала ваша программа при компиляции и связывании. Последнее на самом деле более рискованно, поскольку оно предполагает, что у пользователя будут библиотеки и немодифицированные. Бывший сделайте ваше общее программное обеспечение использовать меньше хранения, но в том числе зависимостей будет означать только увеличение размера пакета, но обеспечивает согласованность во всех системах.
Что касается установки, вам понадобится исполняемый файл bash, который перемещает содержимое вашего каталога в нужные места. Как правило, основное приложение переходит в /usr / bin, а любые данные, связанные с приложением,-в домашнюю папку. Это снова зависит от дистрибутива; ищите a .локальный каталог, или вы можете создать каталог, посвященный вашему приложению, который скрыт. Скрытые папки начинающиеся с точки. Зачем класть все это в домашнюю папку и что? Почему: потому что домашняя папка дает разрешения на чтение и запись для всех по умолчанию. Что: все, что нужно запустить с приложением без необходимости авторизации пользователя. Таким образом, зависимости должны находиться в домашней папке, предпочтительно в вашем собственном каталоге. Различные конвенции следуют; некоторые могут не согласиться со мной в этом один.
вы также можете использовать API steam, который выполняет большую часть этой работы для вас. В Steam ваше приложение может находиться в собственном каталоге steam и, таким образом, функционировать как приложение steam со всеми функциями.
http://www.steampowered.com/steamworks/
чтобы узнать больше о том, как получить приложение в steam. Должен сказать, что я был очень впечатлен, и они даже включают образцы кода. Лучшая часть заключается в том, что этот API также находится в Linux. Я не знаю многого, кроме того, что Steam будет обрабатывать выполнение вашего приложения через свой собственный слой. При этом нет необходимости самостоятельно распространять приложение на предыдущих этапах.
обратите внимание, что вы также можете распространять свое программное обеспечение через программный центр Ubuntu, если вы заинтересованы.
http://developer.ubuntu.com/apps/
хотя Ubuntu больше внимания уделяет запуску приложений независимо от платформа.
знайте, что Linux не имеет Единой конвенции, но ее конвенция просто выведена из прагматизма, а не из теории. В конце концов, как вы хотите, чтобы ваше программное обеспечение работало на Linux, зависит от вас.
Я не разработчик игр, и я пришел из сообщества с открытым исходным кодом, поэтому не могу посоветовать по доставке двоичных файлов. Я постараюсь ответить на некоторые из ваших вопросов:
Valve имеет среду выполнения steam, которую вы можете настроить на linux (https://github.com/ValveSoftware/steam-runtime) - это был бы лучший способ перенести вашу игру. Я видел, что это упоминается в одном из их видеороликов Linux dev на youtube, насколько я понимаю, это связка библиотек, включающих SDL, и она настроена на эмуляция определенной версии ubuntu. Поэтому, если вы напишете свою игру против Steam runtime, она будет работать в любом дистрибутиве linux, который также был портирован steam.
Что касается изначально упаковки вашей игры, то следует учитывать, что если вы упаковываете ее как deb или RPM и поручаете ей зависеть от дистрибутива, предоставленного libraies, чем ваше приложение может сломаться при обновлении библиотек (некоторые дистрибутивы обновляют библиотеки довольно часто - другие более стабильны). Динамическая компоновка против системных библиотек работает хорошо для открытого исходного кода, так как люди могут исправлять код, когда libraies меняются, не идеально подходит для близких источников.
вы можете статически связать свой двоичный файл во время сборки, что означает, что у вас есть двоичный файл большего размера. Но вам не нужно беспокоиться о взломе приложений при обновлении библиотек.
некоторые программы, такие как Chrome, связывают свои собственные библиотеки (которые по существу являются вилками системных библиотек), снова это делает размер загрузки намного больше, но также может вызвать проблемы безопасности, люди обычно хмурятся. (см.: http://lwn.net/Articles/378865/)
1.) Нет, ABIs основных дистрибутивов Linux не полностью совместимы. В узком смысле, они в основном совместимость. Но в более широком смысле, существует много различий, в которых некоторые элементы системы работают, настраиваются и т. д.., OTOH, создание "пакетов" не является большой проблемой per se, просто некоторые работы. Кроме того, то, что работает для" крупного " дистрибутива (например, Debian), работает (почти всегда) на всех производных (например, Ubuntu, Мята...).
2.) Хороший стартовый список для поддержки: Debian (.deb), RedHat и Fedora (.об / мин оба). Их форматы и инструменты пакета зрелы и хорошо известны. Это "покроет" множество деривативов.
3.) Есть некоторые "кросс-дистрибутивные" разработчики пакетов, но в основном они не подходят для этой задачи. Написание сценария определения для большинства форматов пакетов не сложно, как только вы его освоите. Кроме того, некоторые коммерческие инструменты имеют "генераторы сценариев установки" для Linux, которые позаботиться о вещах для вас (они не производят .деб ор .rpm, довольно сложный скрипт оболочки, похожий на установщик Windows EXE)
4. Извините, я мало что знаю о Steam. O:)
Итак, по моему опыту, лучший способ сделать это-принять уродливую правду о том, что вам нужно выбрать несколько основных дистрибутивов и их версии (потому что вещи могут очень сильно меняться между версиями) и делать пакеты для них и часто тестировать на всех из них. И будь счастлив. что вы не разрабатываете какой-то долговечный модуль/драйвер ядра, потому что если вы добавите отслеживание изменений API ядра ко всей картине... :)