使用cython和mingw进行编译会产生gcc:错误:无法识别的命令行选项’-mno-cygwin’

问题:使用cython和mingw进行编译会产生gcc:错误:无法识别的命令行选项’-mno-cygwin’

我正在尝试使用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.

我该如何解决?

I’m trying to compile a python extension with cython in win 7 64-bit using mingw (64-bit).
I’m working with Python 2.6 (Active Python 2.6.6) and with the adequate distutils.cfg file (setting mingw as the compiler)

When executing

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

I get an error saying that gcc has not an -mno-cygwin option:

> 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 is:

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

How could I fix it?


回答 0

听起来好像GCC 4.7.0终于删除了不推荐使用的-mno-cygwin选项,但是distutils尚未赶上它。请安装较旧版本的MinGW,或者distutils\cygwinccompiler.py在Python目录中进行编辑以删除的所有实例-mno-cygwin

It sounds like GCC 4.7.0 has finally removed the deprecated -mno-cygwin option, but distutils has not yet caught up with it. Either install a slightly older version of MinGW, or edit distutils\cygwinccompiler.py in your Python directory to remove all instances of -mno-cygwin.


回答 1

在解决我发现的这些问题和以下问题的过程中,我在此线程中编写了一个配方。我在这里复制它,以防它可能对其他人有用:


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

安装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
Edit 2013:注意,比python 2.7.6和3.3.3–mno-cygwin最终已被删除,因此可以跳过第3步

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

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

5)从mingw-w64-bin_x86_64- mingw_20101003_sezero.zip中获取gendef.exe(tmd64发行版中不提供gendef.exe。另一种解决方案是从源代码编译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

做完了!

During the process of solving these and the following problems I found, I wrote a recipe in this thread. I reproduce it here in case it could be of utility for others:


Step by step recipe to compile 64-bit cython extensions with python 2.6.6 with mingw compiler in win 7 64-bit

Install mingw compiler
1) Install tdm64-gcc-4.5.2.exe for 64-bit compilation

Apply patch to python.h
2) Modify python.h in C:\python26\include as indicated in http://bugs.python.org/file12411/mingw-w64.patch

Modify distutils
Edit 2013: Note than in python 2.7.6 and 3.3.3 -mno-cygwin has been finally removed so step 3 can be skipped.

3) Eliminate all the parameters -mno-cygwin fom the call to gcc in the Mingw32CCompiler class in Python26\Lib\distutils\cygwinccompiler.py
4) In the same module, modify get_msvcr() to return an empty list instead of [‘msvcr90’] when msc_ver == ‘1500’ .

Produce the libpython26.a file (not included in 64 bit python)
Edit 2013: the following steps 5-10 can be skipped by downloading and installing libpython26.a from gohlke.

5) Obtain gendef.exe from mingw-w64-bin_x86_64- mingw_20101003_sezero.zip (gendef.exe is not available in the tmd64 distribution. Another solution is to compile gendef from source…)
6) Copy python26.dll (located at C\windows\system32) to the user directory (C:\Users\myname)
7) Produce the python26.def file with:

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

8) Move the python.def file produced (located in the folder from where gendef was executed) to the user directory
9) Produce the libpython.a with:

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

10) Move the created libpython26.a to C:\Python26\libs

Produce your .pyd extension
11) Create a test hello.pyx file and a setup.py file as indicated in cython tutorial (http://docs.cython.org/src/quickstart/build.html)
12) Compile with

python setup.py build_ext –inplace

Done!


回答 2

现在,该错误已在Python 2.7.6版本候选1中修复。

补丁提交在这里

已解决的问题跟踪器线程在此处

This bug has now been fixed in Python 2.7.6 release candidate 1.

The patching commit is here.

The resolved issue tracker thread is here.


回答 3

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