我是在Windows平台上工作的独立游戏开发人员,但实际上我几乎没有使用Linux并为其部署应用程序。我在Windows上基于SDL 2.0和其他几个跨平台依赖项(如AngelScript或PugiXML)编写了用C ++ 11编写的游戏,我也希望通过Linux分发它,并对此有一些疑问。该游戏是商业,封闭源,目前在Steam的GreenLite,但我想分发从我的网站下载的免费alpha版本,无论GreenLite状态如何。
1。)主要的Linux发行版ABI(应用程序二进制接口)是否兼容?或者我是否需要在每个支持的发行版/平台上编译我的游戏?
2.如果是这样,哪些发行版/平台是合理的选择支持?
3.。)安装应用程序的最佳方式是什么?它依赖于Linux?我已经阅读过有关deb和rpm系统的内容,但它仍然令人困惑 - 有没有办法自动为各种发行版生成安装程序包?
4.。)Steam如何与Linux配合使用?我应该如何准备我的应用程序以通过它分发?
对不起,如果我提出错误的问题,Linux的整个世界对我来说都是新鲜的,我迷失了阅读各种文章和手册页......
答案 0 :(得分:4)
我不是游戏开发者,而且我来自开源社区,因此无法提供有关提供二进制文件的建议。我会尝试回答你的一些问题:
Valve有一个可以在linux上定位的蒸汽运行时(https://github.com/ValveSoftware/steam-runtime) - 这将是移植游戏的最佳方式。我看到它在youtube上的一个Linux开发视频中提到我的理解是它捆绑了一堆包含SDL的库,它被设置为模拟特定版本的ubuntu。因此,如果您针对Steam运行时编写游戏,它将在任何已移植蒸汽的Linux发行版中运行。
至于本地打包你的游戏需要考虑的一件事是,如果你把它打包成deb或RPM,并指示它依赖于发行版提供的图书馆,而不是你的应用程序在库更新时可能会破坏(一些发行版经常更新库) - 其他人更稳定)。动态链接系统库非常适合开源,因为人们可以在图书馆更改不适合近距离源代码时修补代码。
您可以在构建时静态链接二进制文件,这意味着您有一个更大的二进制文件。但是,当你的库更新时,你不必担心应用程序崩溃。
像Chrome这样的程序会捆绑他们自己的库(这些库本身就是系统库的叉子),这使得下载量大得多,但也有可能导致安全问题,人们往往对此不以为然。 (见:http://lwn.net/Articles/378865/)
答案 1 :(得分:3)
这取决于分布的来源。通常,只要代码保持不变,就不需要在Fedora下的Ubuntu上重新编译程序。因为Ubuntu和Fedora必须使用相同的库(尽管可能在不同的位置),并且任何与OpenGL相关的内容都是驱动程序问题;因此,几乎不需要重新编译您的软件。如果你不得不重新编译你的软件,我会非常惊讶,因为所有的发行版都使用几乎相同的库/得到bash /使用Linux内核但是有不同的包管理器。最后一部分是复杂的地方:
上述发行版有不同的包管理器,要求您相应地重新包装您的软件。您可以在tar.gz文件下发布预编译的二进制文件,只需让发行版维护人员为您打包该软件;虽然如果您想控制软件的分发方式,那么您最好自己动手。由于围绕许多包管理器的这个问题,人们仍然需要通过make文件重新编译源代码,该文件可以通过cmake生成。只有当某些依赖性因任何原因重新命名时才会发生这种情况。在这种情况下,由于简单的名称更改,程序神奇地没有找到依赖项。由于也没有命名惯例,它甚至使生活更加艰难。这里最重要的优点是Trust和Trust,让开发人员遵循命名约定,这样每个人都可以引用相同名称的相同包。
支持的最佳发行版是最受欢迎的发行版:Ubuntu和openSUSE将是很好的起点。 Linux Mint,Fedora和Red Hat以及Debian同样使用上述的包管理器。
至于安装,您需要一个bash可执行文件,将目录的内容移动到正确的位置。通常,主应用程序进入/ usr / bin,任何与应用程序相关的数据都会进入主文件夹。这又取决于发行版;查找.local目录,或者您可以创建专用于您的应用程序的隐藏目录。隐藏文件夹以句点为前缀。为什么把这些东西放在主文件夹中,什么?原因:因为主文件夹默认为每个人提供读写权限。什么:需要使用应用程序运行的任何内容,而无需用户进行授权。因此,依赖关系应位于主文件夹中,最好位于您自己的目录下。遵循不同的惯例;有些人可能不同意我的意见。
您可能还想使用Steam的API,它可以帮助您完成大部分工作。在Steam下,您的应用程序可能位于Steam目录下,因此可用作具有其中所有功能的Steam应用程序。
http://www.steampowered.com/steamworks/
了解有关如何让您的应用获得更多信息的更多信息。我不得不说我真的很感动,他们甚至包括代码示例。最好的部分是这个API也在Linux上。我不太了解Steam会通过自己的层处理您的应用程序的执行。其中,没有必要在以前的步骤中独立分发您的应用程序。
请注意,如果您有兴趣,也可以通过Ubuntu软件中心分发您的软件。
http://developer.ubuntu.com/apps/
尽管如此,无论平台如何,Ubuntu都更专注于让应用程序运行。
知道Linux没有单一的约定,但它的约定只是源于实用主义,而不是理论。在一天结束时,您希望软件在Linux上运行的方式取决于您。
答案 2 :(得分:1)
1。)不,主要Linux发行版的ABI不完全兼容。从狭义上讲,它们主要是兼容的。但是从更广泛的意义上讲,系统的某些元素工作,配置等等存在很多差异,OTOH,使“包”不是一个大问题 per se < / em>,只是一些工作。此外,适用于“主要”发行版(如Debian)的作品(几乎总是)适用于所有派生词(如Ubuntu,Mint ......)。
2。)支持的好开始列表是:Debian(.deb),RedHat和Fedora(.rpm)。他们的包装格式和工具已经成熟并且众所周知。这将“涵盖”许多衍生品。
3.。)有一些“交叉分发”包构建器,但大多数不适合这项任务。为大多数包格式编写定义脚本并不难,一旦你掌握了它。此外,一些商业工具具有适用于Linux的“安装脚本生成器”,可以为您处理(它们不生成.deb或.rpm,而是复杂的shell脚本,类似于Windows EXE安装程序)
4.)抱歉,我对Steam不太了解。 ○:)
因此,根据我的经验,最好的方法是接受丑陋的事实,你必须选择几个主要的发行版和他们的版本(因为版本之间的事情可能会发生很大变化并为它们制作包装,并经常对它们进行测试。并且很高兴您没有开发一些长期存在的内核模块/驱动程序,因为如果您将跟踪内核API更改添加到整个图片中......:)