Biên dịch với cython và mingw tạo ra gcc: error: tùy chọn dòng lệnh không được công nhận '-mno-cygwin'


114

Tôi đang cố gắng biên dịch một phần mở rộng python với cython trong win 7 64-bit bằng cách sử dụng mingw (64-bit).
Tôi đang làm việc với Python 2.6 (Active Python 2.6.6) và với tệp distutils.cfg đầy đủ (đặt mingw làm trình biên dịch)

Khi thực hiện

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

Tôi gặp lỗi khi nói rằng gcc không có tùy chọn -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 là:

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

Làm thế nào tôi có thể sửa chữa nó?


Đây là một liên kết ! Đó là giải quyết vấn đề với mới nhất Cython và MinGW
Indrajit Kanjilal

Câu trả lời:


181

Có vẻ như GCC 4.7.0 cuối cùng đã loại bỏ -mno-cygwintùy chọn không được dùng nữa , nhưng các bản phân phối vẫn chưa bắt kịp với nó. Cài đặt phiên bản MinGW cũ hơn một chút hoặc chỉnh sửa distutils\cygwinccompiler.pytrong thư mục Python của bạn để xóa tất cả các phiên bản của -mno-cygwin.


10
Cảm ơn Ignacio. Tôi đã tự mình thử giải pháp này (để loại bỏ -mno-cygwin khỏi cygwinccompyler). Lỗi đã biến mất nhưng sau đó tôi gặp một lỗi khác với ld. Nhưng đây là một câu hỏi khác. Tôi sẽ đăng nó vào ngày mai. Bây giờ cần một số phần còn lại ... tại sao rất khó để biên dịch trong Windows?
joaquin

7
Đây là những gì làm việc cho tôi. Tôi làm theo nguyên văn hướng dẫn của Ignacio. Thay thế 4 trường hợp của chuỗi "-mno-Cygwin" với "" trong tập tin cygwincompile.py
Ram Narasimhan

4
@joaquin: Bạn có quản lý để sắp xếp ldlỗi mà bạn gặp phải không? Tôi đã gặp phải lỗi tương tự và đang đấu tranh để sắp xếp nó.
robintw

@robintw vâng, tôi đã làm. Tôi đã đăng một công thức ngay lúc đó (Và tôi đã tìm thấy nó!). Vui lòng xem chỉnh sửa
joaquin

2
Python 2.7.9 đã giải quyết vấn đề này. Python 2.7.8 vẫn có nó.
fx-kirin

11

Trong quá trình giải quyết những vấn đề này và những vấn đề sau tôi tìm thấy, tôi đã viết một công thức trong chủ đề này . Tôi sao chép nó ở đây trong trường hợp nó có thể hữu ích cho người khác:


Công thức từng bước để biên dịch phần mở rộng 64-bit cython với python 2.6.6 với trình biên dịch mingw trong win 7 64-bit

Cài đặt trình biên dịch mingw
1) Cài đặt tdm64-gcc-4.5.2.exe để biên dịch 64-bit

Áp dụng bản vá cho python.h
2) Sửa đổi python.h trong C: \ python26 \ include như được chỉ ra trong http://bugs.python.org/file12411/mingw-w64.patch

Sửa đổi distutils
Edit 2013: Lưu ý rằng trong python 2.7.6 và 3.3.3 -mno-cygwin cuối cùng đã bị loại bỏ nên có thể bỏ qua bước 3 .

3) Loại bỏ tất cả các tham số -mno-cygwin cho lệnh gọi tới gcc trong lớp Mingw32CCompiler trong Python26 \ Lib \ distutils \ cygwinccompiler.py
4) Trong cùng một mô-đun, hãy sửa đổi get_msvcr () để trả về một danh sách trống thay vì ['msvcr90 '] khi msc_ver ==' 1500 '.

Tạo tệp libpython26.a (không có trong python 64 bit)
Chỉnh sửa 2013: có thể bỏ qua các bước 5-10 sau bằng cách tải xuống và cài đặt libpython26.a từ gohlke .

5) Lấy gendef.exe từ mingw-w64-bin_x86_64- mingw_20101003_sezero.zip (gendef.exe không có sẵn trong bản phân phối tmd64. Một giải pháp khác là biên dịch gendef từ nguồn ...)
6) Sao chép python26.dll (đặt tại C \ windows \ system32) vào thư mục người dùng (C: \ Users \ myname)
7) Tạo tệp python26.def với:

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

8) Di chuyển tệp python.def được tạo (nằm trong thư mục từ nơi gendef được thực thi) vào thư mục người dùng
9) Tạo libpython.a bằng:

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

10) Di chuyển libpython26.a đã tạo sang C: \ Python26 \ libs

Tạo phần mở rộng .pyd của bạn
11) Tạo tệp hello.pyx thử nghiệm và tệp setup.py như được chỉ ra trong hướng dẫn cython ( http://docs.cython.org/src/quickstart/build.html )
12) Biên dịch với

python setup.py build_ext --inplace

Làm xong!


Tôi đã làm bước 1 trên win64 python27. Sau đó, tôi đã thử và cài đặt cython thành công. Tôi không biết phải làm gì với các bản vá trong bước 2.
craastad

@Chris Raastad. Hấp dẫn. Nhưng đây không phải là cài đặt cython mà là cython biên dịch script. Không chắc nếu bạn có ý đó. Dù sao, hai ngày trước có một bình luận từ robintw về việc có lỗi ld. Vì vậy, nếu bạn thực sự có mingw hoạt động, có thể nó phụ thuộc vào phiên bản bạn cài đặt và có thể các thư viện bạn đã cài đặt mà bạn gặp sự cố ngay từ lần đầu tiên hoặc bạn gặp lỗi.
joaquin

1
+1 Đây là một câu trả lời hữu ích. Đối với các tiện ích mở rộng sử dụng numpy, tôi cũng phải hack các tùy chọn bên trong numpy/distutilsthư mục, cho cả hai mingw32compiler.py.
Caleb Hattingh

Trong python27, có vẻ như bạn phải xác định MS_WIN64 bằng cách thêm nó vào tệp cygwinccompiler.py. Xem tại đây: stackoverflow.com/a/19867426/2136991
David

@David trong câu hỏi bạn liên kết OP đề cập đến python26, không phải python27. Bạn đã làm theo chính xác công thức của tôi và vẫn cần thực hiện thay đổi mà bạn đã giới thiệu?
joaquin


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.