使用cython和mingw进行编译会出现gcc: error: unrecognized command line option '-mno-cygwin'错误

115
我正在尝试使用mingw(64位)在win 7 64位上编译一个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.

我该如何解决这个问题?


这里是一个链接!它解决了最新的Cython和MingW问题。 - Indrajit Kanjilal
4个回答

182

听起来像是GCC 4.7.0终于移除了已弃用的 -mno-cygwin选项,但distutils还没有跟上。要么安装稍旧版本的MinGW,要么编辑Python目录下的distutils\cygwinccompiler.py文件,删除所有-mno-cygwin的实例。


10
谢谢,Ignacio。我已经尝试了这个解决方案(从cygwinccompyler中删除-mno-cygwin)。错误消失了,但是我遇到了不同的ld错误。但这是另一个问题了,我明天会发布它。现在需要休息一下...为什么在Windows下编译如此困难? - joaquin
7
这是对我有效的方法。我严格按照Ignacio的指示操作,将cygwincompile.py文件中4个'-mno-cygwin'字符串替换为''。 - Ram Narasimhan
4
@joaquin: 你是否成功解决了出现的 ld 错误?我也遇到了同样的错误,而且一直在尝试解决。 - robintw
@robintw 是的,我做到了。我当时发布了一篇教程(而且我找到它了!)。请查看编辑。 - joaquin
2
Python 2.7.9已经解决了这个问题。Python 2.7.8仍然存在此问题。 - fx-kirin
@Ignacio Vazquez-Abrams,我有一篇Cython帖子,您可能能够提供见解。 - ballade4op52

11
在解决这些问题以及接下来发现的问题的过程中,我在此主题中编写了一个步骤。我在这里重复它,以防它对其他人有用:

一步一步的教程,介绍如何在win 7 64位系统下,使用mingw编译器编译64位Cython扩展库与Python 2.6.6的集成。

安装mingw编译器
1) 安装tdm64-gcc-4.5.2.exe,用于64位编译。

应用python.h补丁
2) 根据http://bugs.python.org/file12411/mingw-w64.patch中的指示修改C:\python26\include目录下的python.h文件。

修改distutils
注:在Python 2.7.6和3.3.3版本中,-mno-cygwin参数已被移除,所以可以跳过第三步。

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

生成libpython26.a文件(64位Python中不包含该文件)
编辑2013年: 步骤5-10可以跳过,通过从gohlke下载和安装libpython26.a来完成。

5) 从mingw-w64-bin_x86_64-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) 按照 Cython 教程(http://docs.cython.org/src/quickstart/build.html)中的指示创建一个测试 hello.pyx 文件和一个 setup.py 文件
12) 使用以下命令进行编译

python setup.py build_ext --inplace

完成!


我在win64 python27上完成了第一步。然后我尝试安装cython并成功安装。我不知道该如何处理第二步的补丁。 - craastad
1
+1 这是一个有用的答案。对于使用numpy的扩展,我还必须在numpy/distutils文件夹中修改选项,包括mingw32compiler.py - Caleb Hattingh
在Python27中,似乎必须通过将其添加到cygwinccompiler.py文件中来定义MS_WIN64。请参见此处:https://dev59.com/eHE85IYBdhLWcg3wUBoZ#19867426 - David
@David 在您链接的问题中,OP 提到的是 python26,而不是 python27。您是否严格按照我的步骤进行操作,仍然需要进行上述更改? - joaquin
@joaquin,我认为第2步提到的补丁无法应用于2.7.5版本中的python.h文件:https://gist.github.com/dstuebe/7385979。我在cygwinccompiler.py中所做的更改似乎以不同的方式完成了相同的事情。如果有更好的方法,我完全支持! - David
显示剩余2条评论

9

-2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接