La compilazione con cython e mingw produce gcc: errore: opzione della riga di comando non riconosciuta '-mno-cygwin'


114

Sto cercando di compilare un'estensione python con cython in win 7 64 bit usando mingw (64 bit).
Sto lavorando con Python 2.6 (Active Python 2.6.6) e con il file distutils.cfg adeguato (impostando mingw come compilatore)

Durante l'esecuzione

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

Ottengo un errore che dice che gcc non ha un'opzione -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.

Come potrei ripararlo?


Ecco un collegamento ! Questo risolve il problema con l'ultimo Cython e MingW
Indrajit Kanjilal

Risposte:


181

Sembra che GCC 4.7.0 abbia finalmente rimosso l' -mno-cygwinopzione deprecata , ma distutils non l'ha ancora raggiunta. Installa una versione leggermente precedente di MinGW o modifica distutils\cygwinccompiler.pynella tua directory Python per rimuovere tutte le istanze di -mno-cygwin.


10
Grazie Ignacio. Ho già provato questa soluzione da solo (per eliminare -mno-cygwin da cygwinccompyler). L'errore è scomparso ma poi ho ricevuto un errore diverso con ld. Ma questa è una domanda diversa. Lo posterò domani. Ora serve un po 'di riposo ... perché è così difficile compilare in Windows?
joaquin

7
Questo è ciò che ha funzionato per me. Ho seguito alla lettera le istruzioni di Ignacio. Sostituite 4 istanze della stringa "-mno-cygwin" con "" nel file cygwincompile.py
Ram Narasimhan

4
@joaquin: sei riuscito a ordinare l' lderrore che hai ricevuto? Ho riscontrato lo stesso errore e sto lottando per risolverlo.
robintw

@robintw sì l'ho fatto. Ho postato una ricetta in quel momento (e l'ho trovata!). Si prega di vedere modifica
joaquin

2
Python 2.7.9 ha risolto questo problema. Python 2.7.8 ce l'ha ancora.
fx-kirin

11

Durante il processo di risoluzione di questi e dei seguenti problemi che ho riscontrato, ho scritto una ricetta in questo thread . Lo riproduco qui nel caso possa essere di utilità per altri:


Ricetta passo passo per compilare estensioni cython a 64 bit con python 2.6.6 con compilatore mingw in win 7 64 bit

Installa il compilatore mingw
1) Installa tdm64-gcc-4.5.2.exe per la compilazione a 64 bit

Applicare la patch a python.h
2) Modificare python.h in C: \ python26 \ include come indicato in http://bugs.python.org/file12411/mingw-w64.patch

Modifica distutils
Modifica 2013: Nota che in python 2.7.6 e 3.3.3 -mno-cygwin è stato finalmente rimosso in modo che il passaggio 3 possa essere saltato .

3) Elimina tutti i parametri -mno-cygwin dalla chiamata a gcc nella classe Mingw32CCompiler in Python26 \ Lib \ distutils \ cygwinccompiler.py
4) Nello stesso modulo, modifica get_msvcr () per restituire un elenco vuoto invece di ['msvcr90 '] quando msc_ver ==' 1500 '.

Produci il file libpython26.a (non incluso in 64 bit python)
Modifica 2013: i seguenti passaggi 5-10 possono essere saltati scaricando e installando libpython26.a da gohlke .

5) Ottieni gendef.exe da mingw-w64-bin_x86_64- mingw_20101003_sezero.zip (gendef.exe non è disponibile nella distribuzione tmd64. Un'altra soluzione è compilare gendef dal sorgente ...)
6) Copia python26.dll (che si trova in C \ windows \ system32) nella directory utente (C: \ Users \ myname)
7) Produrre il file python26.def con:

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

8) Spostare il file python.def prodotto (situato nella cartella da cui è stato eseguito gendef) nella directory utente
9) Produrre libpython.a con:

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

10) Spostare la libpython26.a creata in C: \ Python26 \ libs

Produci la tua estensione .pyd
11) Crea un file hello.pyx di prova e un file setup.py come indicato nel tutorial cython ( http://docs.cython.org/src/quickstart/build.html )
12) Compila con

python setup.py build_ext --inplace

Fatto!


Ho eseguito il passaggio 1 su win64 python27. Quindi ho provato e cython installato con successo. Non avevo idea di cosa fare con la patch nel passaggio 2.
Craastad

@Chris Raastad. Interessante. Ma non si tratta dell'installazione di cython ma della compilazione di uno script da parte di cython. Non sono sicuro se lo intendessi. Ad ogni modo, due giorni fa c'è stato un commento da robintw sull'avere l'errore ld. Quindi, se hai effettivamente mingw funzionante, forse dipende dalla versione che installi e forse dalle librerie che hai già installato che usi al primo colpo o rimani bloccato con errori.
joaquin

1
+1 Questa è una risposta utile. Per le estensioni che utilizzano numpy, ho anche dovuto modificare le opzioni all'interno della numpy/distutilscartella, sia per mingw32compiler.py.
Caleb Hattingh

In python27 sembra che tu debba definire MS_WIN64 aggiungendolo al file cygwinccompiler.py. Vedi qui: stackoverflow.com/a/19867426/2136991
David

@David nella domanda che colleghi l'OP si riferisce a python26, non a python27. Hai seguito esattamente la mia ricetta e dovevi ancora apportare la modifica a cui fai riferimento?
joaquin


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.