使用cython和mingw编译时出现gcc: error: 未识别的命令行选项 '-mno-cygwin
我正在尝试在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 个回答
在解决这些问题的过程中,我写了一份步骤指南,放在了这个讨论串里。为了方便大家,我把它复制过来了,希望能对其他人有帮助:
这是一个逐步的指南,教你如何在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
完成!
听起来GCC 4.7.0已经把不再推荐使用的 -mno-cygwin
选项给删掉了,但distutils还没有跟上这个变化。你可以选择安装一个稍微旧一点的MinGW版本,或者直接去你的Python目录下编辑 distutils\cygwinccompiler.py
文件,把里面所有的 -mno-cygwin
都删掉。