3

我正在编写一个适用于图形并依赖于PySDL2库的 Python 应用程序。PySDL2 依赖于SDL2可以从 SDL 站点下载的已编译二进制库。我写了一个引导脚本来自动化这个过程,但它只适用于 Windows,因为 Linux 没有二进制下载。

问题是如何为 Linux 下载二进制 SDL2?

目前尚不清楚是否有可能创建适用于每个 Linux 的 .so 文件,是否是因为不可能创建适用于每个 CPU 的 .so 文件,这主要是因为不清楚是否在这个方向上已经做了任何工作(我相信人们试图研究这个问题),如果是,那么为什么不采用可移植 .so 文件的格式(针对不同发行版和 CPU 的跨平台)。

更新:我不介意通过 Linux 社区提供的更新和安全修复安装依赖项(包),但这应该在用户空间中完成,并且我需要能够使用可移植脚本自动化它。

4

2 回答 2

4

不要这样做。

最可靠的方法是制作一个完整的静态构建库堆栈。

但这会使您的应用程序完全膨胀,如果这些库中存在任何安全问题,您将需要自己更新它,并且您的所有用户都需要重新下载。

通过使用发行版提供的 SDL 库,您的应用程序将受益于Linux 社区完成的SDL 错误修复和更新

考虑为最常见的发行版(即 Debian、Ubuntu、Redhat、Fedora)提供软件包,这些发行版对发行版提供的 SDL 库具有适当的依赖关系。

当您查看 Skype、Google 等如何分发他们的二进制文件时,它总是在一个特定于分发的包中,然后可以与系统库一起使用。例如 Skype:

Depends: libasound2 (>= 1.0.16), libc6 (>= 2.3.6-6~), libc6 (>= 2.7),
  libgcc1 (>= 1:4.1.1), libqt4-dbus (>= 4:4.5.3), libqt4-network (>= 4:4.8.0),
  libqt4-xml (>= 4:4.5.3), libqtcore4 (>= 4:4.7.0~beta1), libqtgui4 (>= 4:4.8.0),
  libqtwebkit4 (>= 2.1.0~2011week13), libstdc++6 (>= 4.6), libx11-6, libxext6,
  libxss1, libxv1, libssl1.0.0

如您所见,Skype并未包含所有库。安装 Skype 时,用户可能不得不依靠他的包管理器来解决这些依赖关系。

此外,Linux 用户根本不愿意下载或安装二进制文件。如果您真的希望人们使用您的“应用程序”,您最好将其开源并让某人将其包含在主要的 Linux 发行版中。Linux 不是 Windows。Linux 上很少有病毒的原因之一是大多数人不会下载不受信任的软件。

于 2014-01-13T17:23:50.580 回答
3

关于 CPU 架构,Linux 不支持Fat Binaries(不仅仅是每个二进制文件的架构,例如 OS X 中可用的东西)。Ryan Gordon 提出了一个名为 Fat ELF 的提案,遗憾的是它没有成功。

在 SDL2 的特定情况下,库默认链接到很少的库:

ldd /usr/local/lib/libSDL2.so

    linux-vdso.so.1 =>  (0x00007fffd1f0b000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f414c44e000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f414c24a000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f414c02c000)
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f414be24000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f414ba5c000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f414cac4000)

SDL 依赖的其余二进制文件是动态加载的(使用 dlopen),并且 SDL 非常适合某些二进制文件的不同版本。因此,简而言之,如果您在具有某些版本的 libc、libpthread 等的系统中编译并设法找到具有兼容二进制文件的不同系统,那么您很有可能至少可以运行 SDL 二进制文件。在实践中,您最好取决于系统提供的二进制文件,或者接受您将使用定制的 SDL2 支持一组有限的发行版。

请注意,如果您静态链接 SDL,此限制也适用!如果你认为你可以继续添加静态链接的二进制文件,直到你制作了一个可以在任何地方运行的数百兆的静态球(就像我一样!),还有其他限制阻止你这样做,从许可问题到段错误由于静态链接 libpthread。

于 2014-01-13T17:57:07.243 回答