Kompilacja z cythonem i mingw daje gcc: błąd: nierozpoznana opcja wiersza poleceń „-mno-cygwin”

114

Próbuję skompilować rozszerzenie Pythona z cythonem w win 7 64-bit przy użyciu mingw (64-bit).
Pracuję z Pythonem 2.6 (Active Python 2.6.6) iz odpowiednim plikiem distutils.cfg (ustawiając mingw jako kompilator)

Podczas wykonywania

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

Pojawia się błąd informujący, że gcc nie ma opcji -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 to:

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

Jak mogłem to naprawić?

joaquin
źródło
Oto link ! To rozwiązuje problem z najnowszym Cythonem i MingW
Indrajit Kanjilal

Odpowiedzi:

181

Wygląda na to, że GCC 4.7.0 ostatecznie usunęło przestarzałą -mno-cygwinopcję, ale distutils jeszcze go nie dogonił. Zainstaluj nieco starszą wersję MinGW lub edytuj distutils\cygwinccompiler.pyw katalogu Pythona, aby usunąć wszystkie wystąpienia -mno-cygwin.

Ignacio Vazquez-Abrams
źródło
10
Dzięki Ignacio. Sam już wypróbowałem to rozwiązanie (aby wyeliminować -mno-cygwin z cygwinccompyler). Błąd zniknął ale potem pojawił się inny błąd z ld. Ale to jest inne pytanie. Jutro to wyślę. Teraz trzeba trochę odpocząć ... dlaczego tak trudno jest kompilować w systemie Windows?
joaquin
7
To właśnie zadziałało dla mnie. Postępowałem zgodnie z instrukcjami Ignacio dosłownie. Zamieniono 4 wystąpienia ciągu „-mno-cygwin” na „” w pliku cygwincompile.py
Ram Narasimhan,
4
@joaquin: Czy udało Ci się uporządkować otrzymany ldbłąd? Napotkałem ten sam błąd i staram się go rozwiązać.
robintw
@robintw tak, zrobiłem. W tym momencie opublikowałem przepis (i znalazłem go!). Proszę zobaczyć edycję
joaquin
2
Python 2.7.9 rozwiązał ten problem. Python 2.7.8 nadal go ma.
fx-kirin
11

Podczas rozwiązywania tych i następnych problemów, które znalazłem, napisałem przepis w tym wątku . Odtwarzam go tutaj na wypadek, gdyby był przydatny dla innych:


Przepis krok po kroku na kompilację 64-bitowych rozszerzeń Cython w Pythonie 2.6.6 z kompilatorem mingw w systemie Windows 7 64-bit

Zainstaluj kompilator mingw
1) Zainstaluj tdm64-gcc-4.5.2.exe do kompilacji 64-bitowej

Zastosuj poprawkę do python.h
2) Zmodyfikuj python.h w C: \ python26 \ include, jak wskazano w http://bugs.python.org/file12411/mingw-w64.patch

Modyfikuj distutils
Edytuj 2013: Uwaga niż w Pythonie 2.7.6 i 3.3.3 -mno-cygwin został ostatecznie usunięty, więc krok 3 można pominąć .

3) Usuń wszystkie parametry -mno-cygwin z wywołania gcc w klasie Mingw32CCompiler w Python26 \ Lib \ distutils \ cygwinccompiler.py
4) W tym samym module zmodyfikuj get_msvcr () tak, aby zwracała pustą listę zamiast ['msvcr90 '], gdy msc_ver ==' 1500 '.

Stwórz plik libpython26.a (nie dołączony do 64-bitowego Pythona)
Edytuj 2013: poniższe kroki 5-10 można pominąć, pobierając i instalując libpython26.a z gohlke .

5) Uzyskaj plik gendef.exe z mingw-w64-bin_x86_64- mingw_20101003_sezero.zip (plik gendef.exe nie jest dostępny w dystrybucji tmd64. Innym rozwiązaniem jest skompilowanie gendef ze źródła ...)
6) Skopiuj plik python26.dll (znajdujący się w C \ windows \ system32) do katalogu użytkownika (C: \ Users \ myname)
7) Utwórz plik python26.def za pomocą:

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

8) Przenieś utworzony plik python.def (znajdujący się w folderze, z którego wykonano gendef) do katalogu użytkownika
9) Utwórz plik libpython.a za pomocą:

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

10) Przenieś utworzony plik libpython26.a do C: \ Python26 \ libs

Utwórz rozszerzenie .pyd
11) Utwórz testowy plik hello.pyx i plik setup.py, jak wskazano w samouczku cythona ( http://docs.cython.org/src/quickstart/build.html )
12) Skompiluj z

python setup.py build_ext --inplace

Gotowe!

joaquin
źródło
Zrobiłem krok 1 na win64 python27. Potem spróbowałem i cython został pomyślnie zainstalowany. Nie miałem pojęcia, co zrobić z łatką w kroku 2.
craastad
@Chris Raastad. Ciekawy. Ale nie chodzi o instalację Cythona, ale o kompilację skryptu przez Cythona. Nie jestem pewien, czy to miałeś na myśli. W każdym razie, dwa dni temu pojawił się komentarz robintw o błędzie ld. Tak więc, jeśli faktycznie masz działającego mingw, być może zależy to od zainstalowanej wersji i być może bibliotek, które już zainstalowałeś, które wykonujesz za pierwszym razem lub utkniesz z błędami.
joaquin
1
+1 To przydatna odpowiedź. W przypadku rozszerzeń używających numpy musiałem również zhakować opcje w numpy/distutilsfolderze, zarówno dla mingw32compiler.py.
Caleb Hattingh
W pythonie27 wydaje się, że musisz zdefiniować MS_WIN64, dodając go do pliku cygwinccompiler.py. Zobacz tutaj: stackoverflow.com/a/19867426/2136991
David
@David w pytaniu, które łączysz, OP odnosi się do pythona26, a nie do pythona27. Czy postępowałeś dokładnie według mojego przepisu i nadal musiałeś dokonać zmiany, o której mówisz?
joaquin