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


114

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

我该如何解决?


这是一个链接!这解决了与最新的用Cython和MinGW问题
Indrajit Kanjilal

Answers:


181

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


10
谢谢伊格纳西奥。我已经尝试过自己的解决方案(从cygwinccompyler中消除-mno-cygwin)。错误消失了,但是后来我得到了与ld不同的错误。但这是一个不同的问题。我明天发布。现在需要休息一下...为什么在Windows中这么难编译?
华金

7
这对我有用。我完全按照Ignacio的指示进行。在cygwincompile.py文件中用“”替换了字符串“ -mno-cygwin”的4个实例
Ram Narasimhan

4
@joaquin:您是否设法对ld收到的错误进行了排序?我遇到了相同的错误,并且正在努力对其进行排序。
robintw

@robintw是的,我做到了。那时我发布了食谱(我找到了!)。请查看编辑
Joaquin

2
Python 2.7.9解决了这个问题。Python 2.7.8仍然拥有它。
fx-kirin

11

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


在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

做完了!


我在win64 python27上执行了第1步。然后,我尝试并成功安装cython。我不知道在步骤2中做什么用的补丁
craastad

@克里斯·拉斯塔德 有趣。但这与cython安装无关,而是cython编译脚本。不知道你是不是那个意思。无论如何,两天前,robintw发表了有关ld错误的评论。因此,如果您确实有mingw在工作,则可能取决于您安装的版本以及您已经安装的库,因此一开始就会遇到麻烦。
joaquin

1
+1这是一个有用的答案。对于使用numpy的扩展,我还必须修改numpy/distutils文件夹中的选项,两者均用于mingw32compiler.py
Caleb Hattingh 2013年

在python27中,似乎您必须通过将MS_WIN64添加到cygwinccompiler.py文件中来定义它。看到这里:stackoverflow.com/a/19867426/2136991
David

您链接OP的问题中的@David指的是python26,而不是python27。你跟着正是我的食谱,仍然需要让你参考的变化?
joaquin


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.