Das Kompilieren mit cython und mingw erzeugt gcc: error: nicht erkannte Befehlszeilenoption '-mno-cygwin'

114

Ich versuche, eine Python-Erweiterung mit Cython in Win 7 64-Bit mit Mingw (64-Bit) zu kompilieren.
Ich arbeite mit Python 2.6 (Active Python 2.6.6) und mit der entsprechenden Datei distutils.cfg (Einstellung von mingw als Compiler)

Bei der Ausführung

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

Ich erhalte die Fehlermeldung, dass gcc keine Option -mno-cygwin hat:

> 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 ist:

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

Wie könnte ich das beheben?

Joaquin
quelle
Hier ist ein Link ! Das löst das Problem mit den neuesten Cython und MingW
Indrajit Kanjilal

Antworten:

181

Es hört sich so an, als hätte GCC 4.7.0 die veraltete -mno-cygwinOption endgültig entfernt , aber distutils hat sie noch nicht eingeholt. Installieren Sie entweder eine etwas ältere Version von MinGW oder bearbeiten Sie sie distutils\cygwinccompiler.pyin Ihrem Python-Verzeichnis, um alle Instanzen von zu entfernen -mno-cygwin.

Ignacio Vazquez-Abrams
quelle
10
Danke Ignacio. Ich habe diese Lösung bereits selbst ausprobiert (um -mno-cygwin aus cygwinccompyler zu entfernen). Der Fehler ist verschwunden, aber dann habe ich einen anderen Fehler mit ld bekommen. Dies ist jedoch eine andere Frage. Ich werde es morgen posten. Jetzt brauchen Sie etwas Ruhe ... warum ist es so schwierig, in Windows zu kompilieren?
Joaquin
7
Das hat bei mir funktioniert. Ich folgte Ignacios Anweisungen wörtlich. 4 Instanzen der Zeichenfolge "-mno-cygwin" durch "" in der Datei cygwincompile.py ersetzt
Ram Narasimhan
4
@joaquin: Hast du es geschafft, den ldFehler zu sortieren, den du bekommen hast? Ich bin auf den gleichen Fehler gestoßen und habe Mühe, ihn zu sortieren.
Robintw
@robintw ja ich habe. Ich habe in diesem Moment ein Rezept gepostet (und ich habe es gefunden!). Bitte sehen Sie bearbeiten
Joaquin
2
Python 2.7.9 hat dieses Problem gelöst. Python 2.7.8 hat es noch.
FX-Kirin
11

Während der Lösung dieser und der folgenden Probleme habe ich ein Rezept in diesen Thread geschrieben . Ich reproduziere es hier, falls es für andere von Nutzen sein könnte:


Schritt für Schritt Rezept zum Kompilieren von 64-Bit-Cython-Erweiterungen mit Python 2.6.6 mit Mingw-Compiler in Win 7 64-Bit


Mingw- Compiler installieren 1) Installieren Sie tdm64-gcc-4.5.2.exe für die 64-Bit-Kompilierung

Patch auf python.h anwenden
2) Ändern Sie python.h in C: \ python26 \ include wie unter http://bugs.python.org/file12411/mingw-w64.patch angegeben

Distutils ändern
Edit 2013: Hinweis als in Python 2.7.6 und 3.3.3 -mno-cygwin wurde endgültig entfernt, damit Schritt 3 übersprungen werden kann .

3) Entfernen Sie alle Parameter -mno-cygwin aus dem Aufruf von gcc in der Mingw32CCompiler-Klasse in Python26 \ Lib \ distutils \ cygwinccompiler.py.
4) Ändern Sie im selben Modul get_msvcr (), um eine leere Liste anstelle von ['msvcr90 zurückzugeben '] wenn msc_ver ==' 1500 '.

Erstellen Sie die Datei libpython26.a (nicht in 64-Bit-Python enthalten).
Bearbeiten 2013: Die folgenden Schritte 5 bis 10 können übersprungen werden, indem libpython26.a von gohlke heruntergeladen und installiert wird .

5) Beziehen Sie gendef.exe von mingw-w64-bin_x86_64-mingw_20101003_sezero.zip (gendef.exe ist in der tmd64-Distribution nicht verfügbar. Eine andere Lösung besteht darin, gendef aus der Quelle zu kompilieren ...)
6) Kopieren Sie python26.dll (befindet sich bei C. \ windows \ system32) in das Benutzerverzeichnis (C: \ Users \ myname)
7) Erstellen Sie die Datei python26.def mit:

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

8) Verschieben Sie die erstellte Datei python.def (in dem Ordner, in dem gendef ausgeführt wurde) in das Benutzerverzeichnis.
9) Erstellen Sie die Datei libpython.a mit:

dlltool -v --dllname python26.dll --def C: \ Benutzer \ meinname \ python26.def --output-lib C: \ Benutzer \ meinname \ libpython26.a

10) Verschieben Sie die erstellte libpython26.a nach C: \ Python26 \ libs


Erstellen Sie Ihre .pyd-Erweiterung. 11) Erstellen Sie eine Testdatei "hello.pyx" und eine Datei "setup.py", wie im cython-Lernprogramm ( http://docs.cython.org/src/quickstart/build.html ) angegeben.
12) Kompilieren Sie mit

python setup.py build_ext --inplace

Getan!

Joaquin
quelle
Ich habe Schritt 1 auf win64 python27 gemacht. Dann habe ich versucht und Cython erfolgreich installiert. Ich hatte keine Ahnung, was ich mit dem Patch in Schritt 2 machen sollte.
Craastad
@ Chris Raastad. Interessant. Hier geht es jedoch nicht um die Installation von Cython, sondern um das Kompilieren eines Skripts durch Cython. Ich bin mir nicht sicher, ob du das gemeint hast. Wie auch immer, vor zwei Tagen gab es einen Kommentar von robintw über den ld-Fehler. Wenn Sie also tatsächlich MingW arbeiten lassen, hängt es möglicherweise von der Version ab, die Sie installieren, und möglicherweise von den Bibliotheken, die Sie bereits installiert haben.
Joaquin
1
+1 Dies ist eine nützliche Antwort. Für Erweiterungen mit numpy musste ich auch Optionen innerhalb des numpy/distutilsOrdners hacken , sowohl für mingw32compiler.py.
Caleb Hattingh
In python27 müssen Sie MS_WIN64 definieren, indem Sie es der Datei cygwinccompiler.py hinzufügen. Siehe hier: stackoverflow.com/a/19867426/2136991
David
@ David in der Frage, die Sie mit dem OP verknüpfen, bezieht sich auf Python26, nicht auf Python27. Haben Sie genau mein Rezept befolgt und mussten noch die von Ihnen angegebene Änderung vornehmen?
Joaquin