在Linux中部署C++游戏

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

Por*_*ous 4

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

  2. 上述发行版具有不同的包管理器,需要您相应地重新打包您的软件。您可以在 tar.gz 文件下发布预编译的二进制文件,然后让发行版维护人员为您打包软件;不过,如果您想控制软件的分发方式,那么您最好自己做。由于这个问题围绕着许多包管理器,人们仍然通过 make 文件重新编译源代码,该文件可以通过 cmake 生成。仅当某些依赖项因某种原因被“重命名”时才会发生这种情况,在这种情况下,由于简单的名称更改,程序会神奇地找不到依赖项。由于也没有命名约定,这甚至让生活变得更加困难。这里最重要的美德是信任,并且信任其中的开发人员遵循命名约定,以便每个人都可以引用同名的相同包。

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

  1. 同时,您应该知道,如果不使您的软件也成为 GPL,则无法在软件中静态链接 GPL 代码。解决此问题的一种方法是通过以下任一方法解决依赖关系: A. 将相关依赖关系包含在与可执行文件相同的文件夹中(很像 Windows 上的 *.dll),或者依赖于运行程序的系统来查看内部情况您的程序在编译和链接时查看的目录相同。后者实际上风险更大,因为它假设用户将拥有未修改的库。前者将使您的整体软件使用更少的存储空间,但包含依赖项仅意味着增加软件包的大小,但可确保所有系统之间的一致性。

至于安装,您需要一个 bash 可执行文件,将目录的内容移动到正确的位置。通常,主应用程序进入 /usr/bin,任何与应用程序相关的数据都进入主文件夹。这又取决于发行版;查找 .local 目录,或者您可以创建一个专用于您的应用程序的隐藏目录。隐藏文件夹以句点为前缀。为什么要把这些东西放在主文件夹中,以及什么?原因:因为主文件夹默认授予每个人读写权限。什么:需要与应用程序一起运行而无需用户授权的任何内容。因此,依赖项应位于主文件夹中,最好位于您自己的目录下。遵循不同的约定;在这一点上,有些人可能不同意我的观点。

您可能还想使用 steam 的 API,它可以为您完成大部分工作。在Steam下,您的应用程序可能位于steam自己的目录下,因此可以充当具有其中所有功能的steam APP。

http://www.steampowered.com/steamworks/

了解有关如何在 Steam 上发布您的应用程序的更多信息。我不得不说我真的印象深刻,它们甚至包括代码示例。最好的部分是这个 API 也可以在 Linux 上运行。除了 Steam 会通过自己的层处理应用程序的执行之外,我不太了解。其中,不需要像前面的步骤那样独立分发您的应用程序。

请注意,如果您有兴趣,还可以通过 Ubuntu 软件中心分发您的软件。

http://developer.ubuntu.com/apps/

不过,Ubuntu 更注重让应用程序在任何平台上运行。

要知道Linux没有单一的约定,但它的约定只是源自实用主义,而不是理论。归根结底,您希望软件在 Linux 上运行的方式取决于您。