Mengompilasi dengan cython dan mingw menghasilkan gcc: error: opsi baris perintah tidak dikenal '-mno-cygwin'

114

Saya mencoba mengkompilasi ekstensi python dengan cython di win 7 64-bit menggunakan mingw (64-bit).
Saya bekerja dengan Python 2.6 (Active Python 2.6.6) dan dengan file distutils.cfg yang memadai (mengatur mingw sebagai kompiler)

Saat menjalankan

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

Saya mendapatkan pesan kesalahan yang mengatakan bahwa gcc tidak memiliki opsi -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 adalah:

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

Bagaimana saya bisa memperbaikinya?

joaquin
sumber
Ini tautannya ! Itu menyelesaikan masalah dengan Cython dan
MingW

Jawaban:

181

Sepertinya GCC 4.7.0 akhirnya menghapus -mno-cygwinopsi yang tidak digunakan lagi , tetapi distutils belum berhasil melakukannya. Instal versi MinGW yang sedikit lebih lama, atau edit distutils\cygwinccompiler.pydi direktori Python Anda untuk menghapus semua instance -mno-cygwin.

Ignacio Vazquez-Abrams
sumber
10
Terima kasih Ignacio. Saya sudah mencoba solusi ini sendiri (untuk menghilangkan -mno-cygwin dari cygwinccompyler). Kesalahan hilang tapi kemudian saya mendapat kesalahan yang berbeda dengan ld. Tapi ini pertanyaan yang berbeda. Saya akan mempostingnya besok. Sekarang butuh istirahat ... mengapa begitu sulit untuk dikompilasi di windows?
joaquin
7
Inilah yang berhasil bagi saya. Saya mengikuti instruksi Ignacio secara verbatim. Mengganti 4 contoh string "-mno-cygwin" dengan "" di file cygwincompile.py
Ram Narasimhan
4
@ Joaquin: Apakah Anda berhasil mengurutkan ldkesalahan yang Anda dapatkan? Saya mengalami kesalahan yang sama, dan sedang berjuang untuk mengatasinya.
robintw
@robintw ya saya lakukan. Saya memposting resep pada saat itu (Dan saya menemukannya!). Silakan lihat edit
joaquin
2
Python 2.7.9 telah memecahkan masalah ini. Python 2.7.8 masih memilikinya.
fx-kirin
11

Selama proses pemecahan ini dan masalah berikut yang saya temukan, saya menulis resep di utas ini . Saya mereproduksinya di sini seandainya bisa bermanfaat bagi orang lain:


Resep langkah demi langkah untuk mengkompilasi ekstensi cython 64-bit dengan python 2.6.6 dengan kompiler mingw di win 7 64-bit

Instal kompiler mingw
1) Instal tdm64-gcc-4.5.2.exe untuk kompilasi 64-bit

Terapkan patch ke python.h
2) Ubah python.h di C: \ python26 \ include seperti yang ditunjukkan di http://bugs.python.org/file12411/mingw-w64.patch

Modifikasi distutils
Sunting 2013: Catatan daripada di python 2.7.6 dan 3.3.3 -mno-cygwin akhirnya dihapus sehingga langkah 3 dapat dilewati .

3) Hilangkan semua parameter -mno-cygwin dari panggilan ke gcc di kelas Mingw32CCompiler di Python26 \ Lib \ distutils \ cygwinccompiler.py
4) Dalam modul yang sama, modifikasi get_msvcr () untuk mengembalikan daftar kosong alih-alih ['msvcr90 '] ketika msc_ver ==' 1500 '.

Buat file libpython26.a (tidak termasuk dalam 64 bit python)
Edit 2013: langkah 5-10 berikut dapat dilewati dengan mengunduh dan menginstal libpython26.a dari gohlke .

5) Dapatkan gendef.exe dari mingw-w64-bin_x86_64- mingw_20101003_sezero.zip (gendef.exe tidak tersedia di distribusi tmd64. Solusi lain adalah mengompilasi gendef dari sumber ...)
6) Salin python26.dll (terletak di C \ windows \ system32) ke direktori pengguna (C: \ Users \ myname)
7) Buat file python26.def dengan:

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

8) Pindahkan file python.def yang dihasilkan (terletak di folder tempat gendef dieksekusi) ke direktori pengguna
9) Hasilkan libpython.a dengan:

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

10) Pindahkan libpython26.a yang dibuat ke C: \ Python26 \ libs

Buat ekstensi .pyd Anda
11) Buat file test hello.pyx dan file setup.py seperti yang ditunjukkan dalam tutorial cython ( http://docs.cython.org/src/quickstart/build.html )
12) Kompilasi dengan

python setup.py build_ext --inplace

Selesai!

joaquin
sumber
Saya melakukan langkah 1 pada win64 python27. Kemudian saya mencoba dan cython berhasil diinstal. Saya tidak tahu apa yang harus dilakukan dengan tambalan di langkah 2.
craastad
@Raaaaaaaaaaah. Menarik. Tapi ini bukan tentang menginstal cython tetapi cython mengkompilasi skrip. Tidak yakin apakah Anda bersungguh-sungguh. Oya, dua hari yang lalu ada komentar dari robintw tentang error ld nya. Jadi, jika Anda benar-benar memiliki mingw yang berfungsi, mungkin itu tergantung pada versi yang Anda instal dan mungkin pustaka yang sudah Anda instal yang Anda buka saat pertama kali atau Anda terjebak dengan kesalahan.
joaquin
1
+1 Ini adalah jawaban yang berguna. Untuk ekstensi yang menggunakan numpy, saya juga harus meretas opsi di dalam numpy/distutilsfolder, keduanya untuk mingw32compiler.py.
Caleb Hattingh
Di python27 tampaknya Anda harus mendefinisikan MS_WIN64 dengan menambahkannya ke file cygwinccompiler.py. Lihat di sini: stackoverflow.com/a/19867426/2136991
David
@David dalam pertanyaan yang Anda tautkan, OP mengacu pada python26, bukan python27. Apakah Anda benar - benar mengikuti resep saya dan masih perlu melakukan perubahan yang Anda rujuk?
joaquin