python + pyinstaller是否支持Linux的多个OS /版本?

时间:2019-04-09 04:10:48

标签: python linux pyinstaller software-distribution

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

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

  • 在Docker上使用相同版本的Centos构建相同的二进制文件不会产生这些错误。
  • 如果我尝试在Centos 6.6上运行在Centos 7.4上编译的二进制文件,我会再次遇到错误-但是在Centos 6.6上构建它可以与Centos 6.6一起正常工作

我已经使用较低版本的Centos解决了该问题,目前正在构建我的二进制文件。

  • 我的具体问题是-在Python中,这是一种基于目标操作系统(仅假设linux目标)在不同操作系统上构建二进制文件的通用方法吗?解决这个问题的方法?

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

1 个答案:

答案 0 :(得分:1)

只要pyinstaller生成的二进制文件仅取决于glibc,那么在可用的最旧的系统上构建它应该是一种有效的方法,并且应该在将来的系统上工作。

通常,glibc设计为向后兼容,因此针对较早版本的glibc构建的应用程序仍将使用较新的glibc运行,反之则不然。它通过符号版本控制来做到这一点,在该版本中,链接到的每个符号都可以具有与其相关联的版本,并且在任何情况下,如果新的glibc更改了某些功能的ABI,它还将具有与暴露的旧ABI的兼容性例程。使用较旧的符号版本,以便与旧版本链接的应用程序将与兼容性例程动态链接,而如果您有与较新的符号版本链接的应用程序,则较旧的glibc中不会有较新的版本来动态链接

尽管其他库也可以做到这一点,但图书馆的作者并不在意,因此新版本可能根本不兼容,而glibc开发人员通常会尝试保持兼容性。

是的,只要最终二进制文件仅链接到glibc或遵循类似符号版本控制方案的其他库,以确保较旧的二进制文件仍可正确链接至该库的较新版本,则构建该库是完全有效的针对较旧的版本,然后在各种Linux发行版的较新版本上运行它,甚至在各个发行版中也是如此。

不幸的是,如果链接到较新的glibc,没有办法让链接程序选择较旧的符号版本,因此,最简单的方法通常是在Docker或其他类型的包含内部发行版的容器中进行您想与之兼容的最老的glibc。

相关问题