La compilación con cython y mingw produce gcc: error: opción de línea de comando no reconocida '-mno-cygwin'


114

Estoy tratando de compilar una extensión de python con cython en win 7 de 64 bits usando mingw (64 bits).
Estoy trabajando con Python 2.6 (Active Python 2.6.6) y con el archivo distutils.cfg adecuado (configurando mingw como compilador)

Al ejecutar

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

Recibo un error que dice que gcc no tiene una opción -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 es:

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

¿Cómo podría arreglarlo?


¡Aquí hay un enlace ! Eso resuelve el problema con los últimos Cython y MingW
Indrajit Kanjilal

Respuestas:


181

Parece que GCC 4.7.0 finalmente eliminó la -mno-cygwinopción obsoleta , pero distutils aún no la ha alcanzado. Instale una versión un poco más antigua de MinGW o edite distutils\cygwinccompiler.pyen su directorio de Python para eliminar todas las instancias de -mno-cygwin.


10
Gracias Ignacio. Ya probé esta solución por mí mismo (para eliminar -mno-cygwin de cygwinccompyler). El error desapareció pero luego obtuve un error diferente con ld. Pero esta es una pregunta diferente. Lo publicaré mañana. Ahora necesito descansar ... ¿por qué es tan difícil de compilar en Windows?
joaquin

7
Esto es lo que funcionó para mí. Seguí las instrucciones de Ignacio textualmente. Se reemplazaron 4 instancias de la cadena "-mno-cygwin" por "" en el archivo cygwincompile.py
Ram Narasimhan

4
@joaquin: ¿Conseguiste ordenar el lderror que recibiste? Me encontré con el mismo error y estoy luchando por solucionarlo.
robintw

@robintw sí lo hice. Publiqué una receta en ese momento (¡y la encontré!). Por favor ver edición
joaquin

2
Python 2.7.9 ha resuelto este problema. Python 2.7.8 todavía lo tiene.
fx-kirin

11

Durante el proceso de resolución de estos y los siguientes problemas que encontré, escribí una receta en este hilo . Lo reproduzco aquí por si pudiera ser de utilidad para otros:


Receta paso a paso para compilar extensiones cython de 64 bits con python 2.6.6 con el compilador mingw en win 7 de 64 bits

Instale el compilador mingw
1) Instale tdm64-gcc-4.5.2.exe para la compilación de 64 bits

Aplicar el parche a python.h
2) Modificar python.h en C: \ python26 \ include como se indica en http://bugs.python.org/file12411/mingw-w64.patch

Modificar distutils
Edit 2013: tenga en cuenta que en python 2.7.6 y 3.3.3 -mno-cygwin finalmente se ha eliminado, por lo que se puede omitir el paso 3 .

3) Elimine todos los parámetros -mno-cygwin de la llamada a gcc en la clase Mingw32CCompiler en Python26 \ Lib \ distutils \ cygwinccompiler.py
4) En el mismo módulo, modifique get_msvcr () para devolver una lista vacía en lugar de ['msvcr90 '] cuando msc_ver ==' 1500 '.

Produzca el archivo libpython26.a (no incluido en Python de 64 bits)
Edición 2013: los siguientes pasos 5-10 se pueden omitir descargando e instalando libpython26.a desde gohlke .

5) Obtenga gendef.exe de mingw-w64-bin_x86_64- mingw_20101003_sezero.zip (gendef.exe no está disponible en la distribución tmd64. Otra solución es compilar gendef desde la fuente ...)
6) Copie python26.dll (ubicado en C \ windows \ system32) al directorio de usuarios (C: \ Users \ myname)
7) Produzca el archivo python26.def con:

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

8) Mueva el archivo python.def producido (ubicado en la carpeta desde donde se ejecutó gendef) al directorio de usuario
9) Produzca libpython.a con:

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

10) Mueva el libpython26.a creado a C: \ Python26 \ libs

Produzca su extensión .pyd
11) Cree un archivo hello.pyx de prueba y un archivo setup.py como se indica en el tutorial de cython ( http://docs.cython.org/src/quickstart/build.html )
12) Compile con

python setup.py build_ext --inplace

¡Hecho!


Hice el paso 1 en win64 python27. Luego probé y cython se instaló correctamente. No tenía idea de qué hacer con el parche en el paso 2.
craastad

@Chris Raastad. Interesante. Pero no se trata de la instalación de cython, sino de la compilación de un script. No estoy seguro si quisiste decir eso. De todos modos, hace dos días hubo un comentario de Robintw sobre tener el error de ld. Entonces, si realmente tiene mingw funcionando, tal vez dependa de la versión que instale y tal vez de las bibliotecas que ya haya instalado que revise a la primera o se quede atascado con errores.
joaquin

1
+1 Esta es una respuesta útil. Para las extensiones que usan numpy, también tuve que piratear opciones dentro de la numpy/distutilscarpeta, tanto para mingw32compiler.py.
Caleb Hattingh

En python27, parece que debe definir MS_WIN64 agregándolo al archivo cygwinccompiler.py. Vea aquí: stackoverflow.com/a/19867426/2136991
David

@David en la pregunta que vincula, el OP se refiere a python26, no a python27. ¿Seguiste exactamente mi receta y aún necesitas hacer el cambio que refieres?
Joaquin


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.