在Linux中部署C ++游戏

时间:2014-11-20 00:37:15

标签: linux deployment

我是在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的整个世界对我来说都是新鲜的,我迷失了阅读各种文章和手册页......

3 个答案:

答案 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)

  1. 这取决于分布的来源。通常,只要代码保持不变,就不需要在Fedora下的Ubuntu上重新编译程序。因为Ubuntu和Fedora必须使用相同的库(尽管可能在不同的位置),并且任何与OpenGL相关的内容都是驱动程序问题;因此,几乎不需要重新编译您的软件。如果你不得不重新编译你的软件,我会非常惊讶,因为所有的发行版都使用几乎相同的库/得到bash /使用Linux内核但是有不同的包管理器。最后一部分是复杂的地方:

  2. 上述发行版有不同的包管理器,要求您相应地重新包装您的软件。您可以在tar.gz文件下发布预编译的二进制文件,只需让发行版维护人员为您打包该软件;虽然如果您想控制软件的分发方式,那么您最好自己动手。由于围绕许多包管理器的这个问题,人们仍然需要通过make文件重新编译源代码,该文件可以通过cmake生成。只有当某些依赖性因任何原因重新命名时才会发生这种情况。在这种情况下,由于简单的名称更改,程序神奇地没有找到依赖项。由于也没有命名惯例,它甚至使生活更加艰难。这里最重要的优点是Trust和Trust,让开发人员遵循命名约定,这样每个人都可以引用相同名称的相同包。

  3. 支持的最佳发行版是最受欢迎的发行版:Ubuntu和openSUSE将是很好的起点。 Linux Mint,Fedora和Red Hat以及Debian同样使用上述的包管理器。

    1. 与此同时,您应该知道,您无法在软件中静态链接GPL代码,也不会将您的软件也设置为GPL。解决这个问题的一种方法是通过以下任一方式解决依赖关系:A。将相关依赖项包含在与可执行文件相同的文件夹中(很像Windows上的* .dll)或依赖于运行程序的系统查看内部编译和链接时程序查看的相同目录。后者实际上风险更大,因为它假设用户将拥有库并且未经修改。前者将使您的整体软件使用更少的存储,但包括依赖性只会意味着增加包的大小,但确保所有系统的一致性。
    2. 至于安装,您需要一个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更改添加到整个图片中......:)