2

我正在尝试在cygwin上编译PyPy,当python尝试打开刚刚用gcc编译的文件“externmod”时编译停止。cygwin 上 gcc 的问题在于,它会自动将“.exe”附加到您正在编译的任何内容中,因此即使 gcc 被称为gcc -shared -Wl,--enable-auto-image-base -pthread -o /tmp/usession-release-1.8/shared_cache/externmod,输出文件最终也会被externmod.exe忽略。所以 python 试图打开/tmp/usession-release-1.8/shared_cache/externmod并且找不到它 - 因此编译停止。除了重新编译 gcc,任何人都知道如何解决这个问题?我不想那样做。

4

3 回答 3

4

在进行了很多更改之后,我设法编译了它。

  1. PyPy 没有为 Cygwin 提供配置。如上所述,我复制了 Linux 配置并根据需要进行了修改。特别是我删除了 -pthread 标志,--export-dynamic C 链接器标志应该是--export-all-symbols。这也是指定文件扩展名(.exe、.dll)的地方。
  2. Cygwin 没有在 tm 结构中实现 tm_gmtoff 和 tm_zone 字段,它们是 POSIX 标准的 GNU 扩展。PyPy 使用这些字段来确定时区。我实施了解决方法。使用这些 tm 字段包含了几个必须更改的文件。
  3. 在 Cygwin 下,系统调用 waitpid() 期望插槽 2 的参数类型与 PyPy 使用的不同。我实现了一个重新映射参数的包装器。
  4. 在 Cygwin 下,curses C 头文件在 ncurses 下。

您可以在http://www.tux.org/~mayer/cygwin/pypy找到 cygwin 的补丁和说明

于 2012-04-30T22:53:01.640 回答
3

要回答您的问题,解决问题的最简单方法是修改pypy/translator/platform 中的init .py ,使其指向实际平台,而不是现在得到的“无”。在 linux.py 中,您会注意到有一行 `so_ext = 'so' ',这可能是解决扩展问题的原因。

请注意,尽管假装 cygwin 是 linux 的小技巧可以在这个确切的实例中工作,但稍后会有一些道路颠簸会让你受益(不幸的是,我记得没有足够的细节来避免)。

编辑:我的 init.py 的相关部分目前看起来像

if sys.platform == 'cygwin':
    from pypy.translator.platform.linux import Linux, Linux64
    import platform
    if platform.architecture()[0] == '32bit':
        host_factory = Linux
    else:
        host_factory = Linux64
elif sys.platform.startswith('linux'):
于 2012-04-23T16:59:42.127 回答
1

Windows 需要“.exe”扩展名才能知道它是可执行的。您需要修改构建以查找 Windows 并使用 .exe 扩展名。

于 2012-04-20T19:59:46.790 回答