python + pyinstaller 是否支持多个 OS/Versions of linux?

Does python + pyinstaller support multiple OS/Versions of linux?

我在 python 中编写了几个小脚本并使用 pyinstaller 构建了二进制文件。

当我在我的 Ubuntu 16.04 机器上构建它们时——它们会 运行 在我构建它们的机器上运行良好。但是将文件移动到 Centos / Redhat 7.4 机器会给我 GCLIB 和其他 .so 版本依赖性错误。

我现在已经使用较低版本的 Centos 构建我的二进制文件解决了这个问题。

我正在尝试了解如何以标准方式解决此问题。

只要 pyinstaller 生成的二进制文件只依赖于 glibc,那么在可用的最旧系统上构建它应该是一种有效的方法,并且它应该可以在未来的系统上运行。

一般来说,glibc 设计为向后兼容,因此针对较旧版本的 glibc 构建的应用程序仍会 运行 使用较新的 glibc,但反之则不然。它通过符号版本控制实现这一点,其中您 link 的每个符号都可以有一个与之关联的版本,并且在任何情况下,较新的 glibc 已经更改了某些函数的 ABI,它也将具有一个兼容性例程旧的 ABI 使用旧的符号版本公开,因此针对旧的应用程序 linked 将动态地 link 使用兼容性例程,而如果你有一个应用程序 linked 针对较新的符号版本,较旧的 glibc 中不会有更新的版本动态 link 到。

虽然其他库也可以做到这一点,但没有多少库作者愿意这样做,因此较新的版本可能只是不兼容,而 glibc 开发人员通常会尝试保持兼容性。

所以是的,只要最终的二进制文件 link 仅适用于 glibc,或适用于遵循类似符号版本控制方案的其他库,以确保较旧的二进制文件仍 link 正确地更新为较新的库的版本,针对旧版本构建然后 运行 它在各种 Linux 发行版的较新版本上,甚至通常跨发行版也是完全有效的。

不幸的是,如果link针对较新的 glibc,没有好的方法让 linker 选择较旧的符号版本,所以通常最简单的方法是在 link 中选择较旧的符号版本。 =20=] 或其他类型的容器,其中包含您希望与之兼容的最旧 glibc 的较旧发行版。