使用cython和mingw编译时出现gcc: error: 未识别的命令行选项 '-mno-cygwin

115 投票
4 回答
63441 浏览
提问于 2025-04-16 17:49

我正在尝试在64位的Windows 7上使用mingw(64位)编译一个Python扩展,使用的是Cython。
我用的是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.

我该怎么解决这个问题呢?

4 个回答

9

这个问题现在已经在 Python 2.7.6 的候选版本 1 中修复了。

修复的代码提交记录可以在 这里 找到。

解决这个问题的讨论线程可以在 这里 查看。

11

在解决这些问题的过程中,我写了一份步骤指南,放在了这个讨论串里。为了方便大家,我把它复制过来了,希望能对其他人有帮助:


这是一个逐步的指南,教你如何在64位的Windows 7上,用mingw编译器和Python 2.6.6编译64位的Cython扩展。

安装mingw编译器
1) 下载并安装 tdm64-gcc-4.5.2.exe,以便进行64位编译。

修改python.h文件
2) 按照这个链接的说明,修改C:\python26\include目录下的python.h文件。

修改distutils
2013年更新:在Python 2.7.6和3.3.3中,-mno-cygwin这个参数已经被移除,所以第3步可以跳过。

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

生成libpython26.a文件(64位Python中没有这个文件)
2013年更新:接下来的第5到第10步可以通过从gohlke下载并安装libpython26.a来跳过。

5) 从mingw-w64-bin_x86_64-mingw_20101003_sezero.zip中获取gendef.exe(在tdm64发行版中没有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) 创建一个测试用的hello.pyx文件和一个setup.py文件,具体内容可以参考Cython教程中的说明(http://docs.cython.org/src/quickstart/build.html)。
12) 使用以下命令进行编译:

python setup.py build_ext --inplace

完成!

182

听起来GCC 4.7.0已经把不再推荐使用的 -mno-cygwin 选项给删掉了,但distutils还没有跟上这个变化。你可以选择安装一个稍微旧一点的MinGW版本,或者直接去你的Python目录下编辑 distutils\cygwinccompiler.py 文件,把里面所有的 -mno-cygwin 都删掉。

撰写回答