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

joa*_*uin 114 python distutils mingw cython

我正在尝试使用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
Run Code Online (Sandbox Code Playgroud)

我得到一个错误,说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
Run Code Online (Sandbox Code Playgroud)

gcc是:

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

我该怎么办呢?

Ign*_*ams 181

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

  • 谢谢伊格纳西奥.我自己已经尝试过这个解决方案(从cygwinccompyler中消除-mno-cygwin).错误消失了,但后来我得到了与ld不同的错误.但这是一个不同的问题.我明天会发布.现在需要休息一下......为什么在Windows中编译这么困难? (10认同)
  • 我们正在开发一个针对distutils的补丁:http://bugs.python.org/issue12641 (9认同)
  • 这对我有用.我逐字遵循伊格纳西奥的指示.在cygwincompile.py文件中用""替换了字符串"-mno-cygwin"的4个实例 (7认同)
  • @joaquin:你有没有设法对你得到的`ld`错误进行排序?我遇到了同样的错误,我正在努力排序它. (4认同)
  • Python 2.7.9已经解决了这个问题.Python 2.7.8仍然有它. (2认同)

joa*_*uin 11

在解决这些以及我发现的以下问题的过程中,我在这个帖子中写了一个食谱.我在这里重现它,以防它对其他人有用:


逐步配方使用python 2.6.6编译64位cython扩展,在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
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(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

完成!


Mic*_*ael 9

现在已在Python 2.7.6候选版本1中修复了此错误.

修补提交就在这里.

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