在Linux上使用cx_freeze冻结共享对象

时间:2013-04-23 11:54:34

标签: 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检查)。

我的问题很简单,我尝试的这种方法很糟糕,因为它没有做递归依赖性解析。因此我的问题是“这样做的更好方法是什么?还是应该在我的安装程序中编写递归依赖解决方案?”

为了击败解决方案:“使用原生Python代替”,我们得到了一些硬件设备(想想2~4U)和Linux(以及Bash访问)我们想要运行它。移植整个python(及其动态链接etcetc)看起来像我们可以cx_freeze它并运送图书馆的工作。

1 个答案:

答案 0 :(得分:1)

我不知道您的其他问题,但按照here解释,将libc.so.6发送到另一个系统无法正常工作