การคอมไพล์ด้วย cython และ mingw สร้าง gcc: error: ตัวเลือกบรรทัดคำสั่งที่ไม่รู้จัก '-mno-cygwin'


114

ฉันพยายามรวบรวมส่วนขยาย python กับ cython ใน win 7 64 บิตโดยใช้ mingw (64 บิต)
ฉันกำลังทำงานกับ Python 2.6 (Active Python 2.6.6) และมีไฟล์ distutils.cfg ที่เพียงพอ (ตั้งค่า mingw เป็นคอมไพเลอร์)

เมื่อดำเนินการ

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

ฉันได้รับข้อผิดพลาดแจ้งว่า gcc ไม่มีตัวเลือก -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.

ฉันจะแก้ไขได้อย่างไร?


นี่คือลิงค์ ! ที่แก้ปัญหาด้วย Cython และ MingW ล่าสุด
Indrajit Kanjilal

คำตอบ:


181

ดูเหมือนว่า GCC 4.7.0 ได้ลบ-mno-cygwinตัวเลือกที่เลิกใช้แล้วในที่สุดแต่สิ่งที่ไม่พึงปรารถนาก็ยังไม่สามารถใช้งานได้ ติดตั้ง MinGW เวอร์ชันเก่ากว่าเล็กน้อยหรือแก้ไขdistutils\cygwinccompiler.pyในไดเร็กทอรี Python ของคุณเพื่อลบอินสแตนซ์ทั้งหมดของ-mno-cygwin.


10
ขอบคุณ Ignacio ฉันลองวิธีแก้ปัญหานี้ด้วยตัวเองแล้ว (เพื่อกำจัด -mno-cygwin จาก cygwinccompyler) ข้อผิดพลาดหายไป แต่แล้วฉันก็ได้รับข้อผิดพลาดอื่นกับ ld แต่นี่เป็นคำถามที่แตกต่างกัน ผมจะโพสต์ในวันพรุ่งนี้ ตอนนี้ต้องการพักผ่อนบ้าง ... ทำไมคอมไพล์ใน windows ยากจัง?
joaquin

7
นี่คือสิ่งที่ได้ผลสำหรับฉัน ฉันทำตามคำแนะนำของอิกนาซิโอทุกคำ แทนที่สตริง "-mno-cygwin" ด้วย "" 4 อินสแตนซ์ในไฟล์ cygwincompile.py
Ram Narasimhan

4
@joaquin: คุณจัดการเรียงลำดับldข้อผิดพลาดที่คุณได้รับหรือไม่? ฉันพบข้อผิดพลาดเดียวกันและกำลังดิ้นรนเพื่อจัดเรียง
robintw

@robintw ใช่ฉันทำ ฉันโพสต์สูตรอาหารในขณะนั้น (และฉันพบมัน!) โปรดดูแก้ไข
joaquin

2
Python 2.7.9 ได้แก้ปัญหานี้แล้ว Python 2.7.8 ยังมีอยู่
fx-kirin

11

ในระหว่างกระบวนการแก้ไขปัญหาเหล่านี้และปัญหาต่อไปนี้ที่ฉันพบฉันได้เขียนสูตรอาหารในชุดข้อความนี้ ฉันทำซ้ำที่นี่ในกรณีที่อาจเป็นประโยชน์สำหรับผู้อื่น:


สูตรทีละขั้นตอนในการรวบรวมส่วนขยาย cython 64 บิตด้วย python 2.6.6 พร้อมด้วยคอมไพเลอร์ mingw ใน win 7 64-bit

ติดตั้งคอมไพเลอร์ mingw
1) ติดตั้ง tdm64-gcc-4.5.2.exe สำหรับการคอมไพล์ 64 บิต

ใช้โปรแกรมแก้ไขกับ python.h
2) แก้ไข python.h ใน C: \ python26 \ include ตามที่ระบุใน http://bugs.python.org/file12411/mingw-w64.patch

ปรับเปลี่ยน distutils
แก้ไข 2013: หมายเหตุกว่าในหลาม 2.7.6 และ 3.3.3 -mno-Cygwin ได้ถูกลบออกในที่สุดดังนั้นขั้นตอนที่ 3 สามารถข้าม

3) กำจัดพารามิเตอร์ทั้งหมด -mno-cygwin สำหรับการเรียกไปยัง gcc ในคลาส Mingw32CCompiler ใน Python26 \ Lib \ distutils \ cygwinccompiler.py
4) ในโมดูลเดียวกันแก้ไข get_msvcr () เพื่อส่งคืนรายการว่างแทน ['msvcr90 '] เมื่อ msc_ver ==' 1500 '

ผลิตไฟล์ libpython26.a (ที่ไม่รวมอยู่ในหลาม 64 บิต)
แก้ไข 2013: ขั้นตอนต่อไป 5-10 สามารถข้ามได้โดยการดาวน์โหลดและติดตั้ง libpython26.a จาก gohlke

5) รับ gendef.exe จาก mingw-w64-bin_x86_64- mingw_20101003_sezero.zip (gendef.exe ไม่มีในการแจกแจง tmd64 อีกวิธีหนึ่งคือรวบรวม gendef จาก source ... )
6) คัดลอก python26.dll (อยู่ที่ C \ windows \ system32) ไปยังไดเร็กทอรีผู้ใช้ (C: \ Users \ myname)
7) สร้างไฟล์ python26.def ด้วย:

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

8) ย้ายไฟล์ python.def ที่สร้าง (อยู่ในโฟลเดอร์ที่เรียกใช้งาน gendef) ไปยังไดเร็กทอรีผู้ใช้
9) สร้าง libpython.a ด้วย:

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

10) ย้าย libpython26.a ที่สร้างขึ้นไปที่ C: \ Python26 \ libs

สร้างนามสกุล. pyd ของคุณ
11) สร้างไฟล์ hello.pyx ทดสอบและไฟล์ setup.py ตามที่ระบุไว้ในบทช่วยสอน cython ( http://docs.cython.org/src/quickstart/build.html )
12) รวบรวมด้วย

python setup.py build_ext --inplace

ทำ!


ฉันทำขั้นตอนที่ 1 ใน win64 python27 จากนั้นฉันก็ลองและติดตั้ง cython สำเร็จ ฉันไม่รู้ว่าจะทำอย่างไรกับแพทช์ในขั้นตอนที่ 2
Craastad

@Chris Raastad. น่าสนใจ แต่นี่ไม่เกี่ยวกับการติดตั้ง cython แต่เป็นการคอมไพล์สคริปต์ ไม่แน่ใจว่าคุณหมายถึงอย่างนั้นหรือเปล่า อย่างไรก็ตามสองวันที่ผ่านมามีความคิดเห็นจาก robintw เกี่ยวกับข้อผิดพลาด ld ดังนั้นหากคุณใช้งาน mingw ได้จริงอาจจะขึ้นอยู่กับเวอร์ชันที่คุณติดตั้งและอาจจะขึ้นอยู่กับไลบรารีที่คุณติดตั้งไว้แล้วที่คุณไปถึงในนัดแรกหรือคุณติดขัดกับข้อผิดพลาด
joaquin

1
+1 นี่คือคำตอบที่มีประโยชน์ สำหรับส่วนขยายที่ใช้ numpy ฉันต้องแฮ็กตัวเลือกภายในnumpy/distutilsโฟลเดอร์ด้วยทั้งสำหรับmingw32compiler.pyไฟล์.
Caleb Hattingh

ใน python27 ดูเหมือนว่าคุณต้องกำหนด MS_WIN64 โดยเพิ่มลงในไฟล์ cygwinccompiler.py ดูที่นี่: stackoverflow.com/a/19867426/2136991
David

@David ในคำถามที่คุณเชื่อมโยง OP อ้างถึง python26 ไม่ใช่ python27 คุณทำตามสูตรของฉันอย่างถูกต้องและยังจำเป็นต้องทำการเปลี่ยนแปลงที่คุณอ้างถึงหรือไม่?
joaquin


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.