【问题标题】:Compiling with cython and mingw produces gcc: error: unrecognized command line option '-mno-cygwin'用 cython 和 mingw 编译会产生 gcc: error: unrecognized command line option '-mno-cygwin'
【发布时间】:2011-08-27 10:09:57
【问题描述】:

我正在尝试使用 mingw(64 位)在 win 7 64 位中使用 cython 编译 python 扩展。
我正在使用 Python 2.6(Active Python 2.6.6)和足够的 distutils.cfg 文件(将 mingw 设置为编译器)

执行时

> C:\Python26\programas\Cython>python setup.py build_ext --inplace

我收到一条错误消息,说 gcc 没有 -mno-cygwin 选项:

> C:\Python26\programas\Cython>python setup.py build_ext --inplace
running build_ext
skipping 'hello2.c' Cython extension (up-to-date)
building 'hello2' extension
C:\mingw\bin\gcc.exe -mno-cygwin -mdll -O -Wall -IC:\Python26\include -IC:\Python26\PC -c hello2.c -o build\temp.win-amd64-2.6\Release\hello2.o
gcc: error: unrecognized command line option '-mno-cygwin'
error: command 'gcc' failed with exit status 1

gcc 是:

C:\>gcc --version
gcc (GCC) 4.7.0 20110430 (experimental)
Copyright (C) 2011 Free Software Foundation, Inc.

我该如何解决?

【问题讨论】:

  • 这里是a link!用最新的 Cython 和 MingW 解决问题

标签: python mingw distutils cython


【解决方案1】:

听起来 GCC 4.7.0 终于删除了已弃用的 -mno-cygwin 选项,但 distutils 还没有赶上它。安装稍旧版本的 MinGW,或在 Python 目录中编辑 distutils\cygwinccompiler.py 以删除所有 -mno-cygwin 实例。

【讨论】:

  • 谢谢伊格纳西奥。我已经自己尝试过这个解决方案(从 cygwinccompyler 中消除 -mno-cygwin)。错误消失了,但后来我得到了一个与 ld 不同的错误。但这是一个不同的问题。我明天会发布它。现在需要休息一下……为什么在windows中编译这么难?
  • 这对我有用。我一字不差地听从了伊格纳西奥的指示。将 cygwincompile.py 文件中的 4 个字符串“-mno-cygwin”实例替换为“”
  • @joaquin:您是否设法对遇到的ld 错误进行排序?我遇到了同样的错误,正在努力对其进行排序。
  • @robintw 是的,我做到了。在那一刻我发布了一个食谱(我找到了它!)。请参阅编辑
  • Python 2.7.9 已经解决了这个问题。 Python 2.7.8 仍然有它。
【解决方案2】:

在解决这些和我发现的以下问题的过程中,我在this thread 中写了一个食谱。我在这里复制它以防它对其他人有用:


使用 python 编译 64 位 cython 扩展的分步配方 2.6.6 在 win 7 64 位中使用 mingw 编译器

安装mingw编译器
1) 安装 tdm64-gcc-4.5.2.exe 进行 64 位编译

将补丁应用到 python.h
2) 修改 C:\python26\include 中的 python.h,如中所示 http://bugs.python.org/file12411/mingw-w64.patch

修改 distutils
2013 年编辑:请注意,在 python 2.7.6 和 3.3.3 中,-mno-cygwin 最终已被删除,因此可以跳过第 3 步 .

3) 去掉调用 gcc 中的所有参数 -mno-cygwin Python26\Lib\distutils\cygwinccompiler.py 中的 Mingw32CCompiler 类
4)在同一个模块中,修改get_msvcr()返回一个空列表 而不是 ['msvcr90'] 当 msc_ver == '1500' 时。

生成 libpython26.a 文件(不包括在 64 位 python 中)
编辑 2013:可以通过从以下位置下载并安装 libpython26.a 跳过以下步骤 5-10 gohlke

5) 从mingw-w64-bin_x86_64-获取gendef.exe mingw_20101003_sezero.zip (gendef.exe 在 tmd64 发行版中不可用。另一个 解决方案是从源代码编译 gendef...)
6)将python26.dll(位于C\windows\system32)复制给用户 目录 (C:\Users\myname)
7) 生成 python26.def 文件:

gendef.exe C:\Users\myname\python26.dll

8) 移动生成的 python.def 文件(位于文件夹中 gendef 已执行)到用户目录
9) 使用以下命令生成 libpython.a:

dlltool -v --dllname python26.dll --def C:\Users\myname \python26.def --output-lib C:\Users\myname\libpython26.a

10) 将创建的 libpython26.a 移动到 C:\Python26\libs

生成您的 .pyd 扩展名
11) 创建一个测试 hello.pyx 文件和一个 setup.py 文件,如中所示 cython 教程 (http://docs.cython.org/src/quickstart/build.html)
12) 编译

python setup.py build_ext --inplace

完成!

【讨论】:

  • 我在 win64 python27 上做了第 1 步。然后我尝试并成功安装了cython。我不知道如何处理第 2 步中的补丁。
  • @Chris Raastad。有趣的。但这不是关于 cython 安装,而是 cython 编译脚本。不知道你是不是这个意思。无论如何,两天前有来自 robintw 的评论关于有 ld 错误。所以,如果你真的有 mingw 工作,也许这取决于你安装的版本,也可能取决于你已经安装的库,你一开始就通过了,或者你遇到了错误。
  • +1 这是一个有用的答案。对于使用 numpy 的扩展,我还必须破解 numpy/distutils 文件夹中的选项,两者都是 mingw32compiler.py
  • 在 python27 中,您似乎必须通过将 MS_WIN64 添加到 cygwinccompiler.py 文件中来定义它。见这里:stackoverflow.com/a/19867426/2136991
  • @David 在您链接 OP 的问题中指的是 python26,而不是 python27。您是否完全按照我的食谱进行操作,但仍需要进行您所指的更改?
【解决方案3】:

此错误现已在 Python 2.7.6 release candidate 1 中修复。

补丁提交是here

已解决的问题跟踪线程是here

【讨论】:

    【解决方案4】:

    试试这个。它确实适用于错误
    https://github.com/develersrl/gccwinbinaries

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-06
      • 2012-01-21
      • 1970-01-01
      • 1970-01-01
      • 2013-07-22
      • 2012-02-13
      • 2014-05-07
      相关资源
      最近更新 更多