我正在编写一个适用于图形的Python应用程序,它依赖于PySDL2库。 PySDL2依赖于编译的SDL2
二进制库,可以是downloaded from SDL site。我写了一个bootstrap script to automate the process,但它只适用于Windows,因为Linux没有二进制下载。
问题是如何为Linux下载二进制SDL2?
目前尚不清楚是否可以创建适用于每个Linux的.so文件,如果是因为无法创建可在每个CPU上运行的.so文件,那主要是因为它是不清楚是否已经在这个方向上做了任何工作(我相信人们试图研究这个问题),如果是,那么为什么不采用便携式.so文件格式(针对不同发行版和CPU的跨平台)的格式。
更新:我不介意安装Linux社区提供的更新和安全修复程序的依赖项(软件包),但这应该在用户空间中完成,我需要能够自动执行它便携式脚本。
答案 0 :(得分: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上病毒很少的原因之一是因为大多数人不下载不受信任的软件。
答案 1 :(得分: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,此限制也适用!如果你认为你可以继续添加静态链接的二进制文件,直到你做了几百个megs的静态球运行(就像我做的那样!),还有其他限制阻止你这样做,从许可问题到段错误由于静态链接libpthread。