python - 在 Linux 上使用 cx_freeze 卡住共享对象

标签 python libc cx-freeze

我正在尝试 CX_Freeze Linux 平台的应用程序。 Windows MSI 安装程序运行完美,但 Linux 对应部分并没有真正按照我想要的方式运行。

构建包时,它可以在原始系统上完美运行,但是当移植到不同的系统(尽管架构相同)时,它会产生段错误。我做的第一件事是检查库,发现 libc、pthread 和 libdl 存在一些巨大的版本差异。所以我决定将这些包含在构建中,如下所示:

if windows_build:
    build_exe_options['packages'].append("win32net")
    build_exe_options['packages'].append("win32security")
    build_exe_options['packages'].append("win32con")
    pywintypes_dll = 'pywintypes{0}{1}.dll'.format(*sys.version_info[0:2])      # e.g. pywintypes27.dll
    build_exe_options['include_files'].append((os.path.join(GetSystemDirectory(), pywintypes_dll), pywintypes_dll))
else:
    build_exe_options['packages'].append("subprocess")
    build_exe_options['packages'].append("encodings")
    arch_lib_path = ("/lib/%s-linux-gnu" % os.uname()[4])
    shared_objects = ["libc.so.6", "libpthread.so.0", "libz.so.1", "libdl.so.2", "libutil.so.1", "libm.so.6", "libgcc_s.so.1", "ld-linux-x86-64.so.2"]
    lib_paths = ["/lib", arch_lib_path, "/lib64"]
    for so in shared_objects:
        for lib in lib_paths:
            lib_path = "%s/%s" % (lib, so)
            if os.path.isfile(lib_path):
                build_exe_options['include_files'].append((lib_path, so))
                break

在检查了原始的 cx_frozen bin 之后,动态库似乎发挥了作用并完美地拦截了调用。虽然现在我处于 pthread 段错误的部分,因为他尝试使用系统 libc 而不是我的(用 ldd 和 gdb 检查)。

我的问题很简单,我正在尝试的这个方法很糟糕,因为它不进行递归依赖解析。因此,我的问题是“这样做的更好方法是什么?或者我应该在我的安装程序中编写递归依赖解决方案吗?”

为了击败解决方案:“改用 native Python”,我们获得了一些带有 Linux(和 Bash 访问权限)的硬件设备(想想 2~4U),我们也想在其中运行它。当我们可以 cx_freeze 并附带库时,移植整个 python(及其动态链接等)似乎是很多工作的方法。

最佳答案

我不知道你的其他问题,但是按照你的方式将 libc.so.6 传送到另一个系统不可能工作,如 here 所解释的.

关于python - 在 Linux 上使用 cx_freeze 卡住共享对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16168691/

相关文章:

python - 在python中使用正则表达式提取括号内的单词

linux - 对 `fstat` 、 `lstat` 或 `stat` 的并行调用是否受到 linux 上打开文件限制的限制?

c - 为什么 gcc/clang 默认知道链接到 libc?

c - 为什么 execvp 的 argv 参数不是 const?

python - 使用 cx_Freeze 编译为 exe 时没有此类文件或目录 webdriver_prefs.json

python - 使用gabor内核提取垂直线会产生黑色图像

python - 如何修复sketch_rnn算法中的 'Object arrays cannot be loaded when allow_pickle=False'

数组包含区域的 Python 算法(图)

python - cx-freeze、runpy 和 multiprocessing - 多条失败路径

Python cx_freeze 4.3.4 : Setting targetName causes errors