我用python编写了几个小脚本,并使用pyinstaller构建了二进制文件。
当我在Ubuntu 16.04机器上构建它们时-它们将在我构建它们的机器上正常运行。但是将文件移到Centos / Redhat 7.4机器上会给我GCLIB和其他.so版本依赖性错误。
我已经使用较低版本的Centos解决了该问题,目前正在构建我的二进制文件。
我试图了解如何以标准方式解决此问题。
答案 0 :(得分:1)
只要pyinstaller生成的二进制文件仅取决于glibc,那么在可用的最旧的系统上构建它应该是一种有效的方法,并且应该在将来的系统上工作。
通常,glibc设计为向后兼容,因此针对较早版本的glibc构建的应用程序仍将使用较新的glibc运行,反之则不然。它通过符号版本控制来做到这一点,在该版本中,链接到的每个符号都可以具有与其相关联的版本,并且在任何情况下,如果新的glibc更改了某些功能的ABI,它还将具有与暴露的旧ABI的兼容性例程。使用较旧的符号版本,以便与旧版本链接的应用程序将与兼容性例程动态链接,而如果您有与较新的符号版本链接的应用程序,则较旧的glibc中不会有较新的版本来动态链接
尽管其他库也可以做到这一点,但图书馆的作者并不在意,因此新版本可能根本不兼容,而glibc开发人员通常会尝试保持兼容性。
是的,只要最终二进制文件仅链接到glibc或遵循类似符号版本控制方案的其他库,以确保较旧的二进制文件仍可正确链接至该库的较新版本,则构建该库是完全有效的针对较旧的版本,然后在各种Linux发行版的较新版本上运行它,甚至在各个发行版中也是如此。
不幸的是,如果链接到较新的glibc,没有办法让链接程序选择较旧的符号版本,因此,最简单的方法通常是在Docker或其他类型的包含内部发行版的容器中进行您想与之兼容的最老的glibc。