CX#u Freeze:Arch-Linux的可执行文件不';由于GLIBC不兼容,无法在Ubuntu 20.04上工作

CX#u Freeze:Arch-Linux的可执行文件不';由于GLIBC不兼容,无法在Ubuntu 20.04上工作,linux,ubuntu,glibc,cx-freeze,archlinux,Linux,Ubuntu,Glibc,Cx Freeze,Archlinux,Arch Linux在GLIBC 2.33版上: 但Ubuntu20.04在Glibc2.31上: $/lib/x86_64-linux-gnu/libc.so.6 --version GNU C Library (Ubuntu GLIBC 2.31-0ubuntu9.2) stable release version 2.31. 因此,当我尝试在Ubuntu20.04上运行我的Arch Linux系统上由CX_Freeze生成的可执行文件时,我得到: ./Documents/exe.linu

Arch Linux在GLIBC 2.33版上:

但Ubuntu20.04在Glibc2.31上:

$/lib/x86_64-linux-gnu/libc.so.6 --version
GNU C Library (Ubuntu GLIBC 2.31-0ubuntu9.2) stable release version 2.31.
因此,当我尝试在Ubuntu20.04上运行我的Arch Linux系统上由CX_Freeze生成的可执行文件时,我得到:

./Documents/exe.linux-x86_64-3.8/myapp: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.32' not found (required by ./Documents/exe.linux-x86_64-3.8/myappp
./Documents/exe.linux-x86_64-3.8/myapp: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.33' not found (required by ./Documents/exe.linux-x86_64-3.8/myapp)
如何从ArchLinux中生成一个可执行文件,ArchLinux可以在像Ubuntu20.04这样的旧linux系统上运行(在GLIBC方面)

如何从ArchLinux中生成一个可执行文件,ArchLinux可以在像Ubuntu20.04这样的旧linux系统上运行(在GLIBC方面)

选项:

  • 在虚拟化环境中运行Ubuntu 20.04并在那里编译(即docker),或者
  • 从源代码处编译glibc 2.31并安装在archlinux上,并将应用程序与其链接,或者
  • 将archlinux降级到glibc 2.31版本,或
  • 与glibc或其他C标准库静态链接,或
  • 复制已编译的glibc库,并使用自定义配置和一些启动脚本将其与应用程序一起分发,或者
  • 在安装应用程序的情况下,使用archlinux分发整个chroot(您可以使用systemd machine或发布docker映像或类似工具)

TBH只需在docker中运行ubuntu:20.04并在那里构建应用程序。通常,应用程序是为每个发行版单独构建的。

您需要从源代码构建一个glibc,并将所有库放在一个文件夹中

例如,对于Ubuntu20.04目标系统(只理解使用GLIBC_2.31编译的可执行文件),将5个生成的
so
文件放入GLIBC_LIB文件夹:

  • ld-2.31.so
  • ld-linux-x86-64.so.2
  • libc.so.6
  • libm.so.6
  • libpthread.so.0
然后,使用以下命令运行CX_Freeze:

LD_LIBRARY_PATH=/path/to/GLIBC_LIB python setup.py build

注意:您不能链接特定的库文件,您需要链接库所在的文件夹。

问题是什么?我看到了事实陈述。@tehhowch抱歉,我编辑过你做了什么研究?例如@KamilCuk这很有趣(我在搜索中没有使用
linker
这个词,只使用了
cx-freeze
glibc
,但没有得到任何结果)。但是它没有解释如何使用CX\U Freeze执行此操作。
将您的应用程序与之链接
您能描述一下如何使用CX\U Freeze执行此操作吗?不,我不能。我没有这方面的经验。cx-freeze-6.6在PyPi中,可以与pip3一起安装:
pip3安装cx-freeze
更简单地说,只需做你已经做过的事情,但要在Ubuntu 20.04容器中或在另一个适当兼容的环境中。一般来说,在较旧的系统上制作的东西在稍新的系统上可以正常运行,而在稍新的系统上则不可能正常运行。
LD_PRELOAD
较新的GLIBC将不起作用:这不起作用,原因如下: