Компиляция с помощью cython и mingw дает gcc: error: нераспознанный параметр командной строки '-mno-cygwin'

114

Я пытаюсь скомпилировать расширение python с помощью cython в 64-разрядной версии win 7, используя 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
Индраджит Канджилал

Ответы:

181

Похоже, что GCC 4.7.0 наконец удалил устаревшую -mno-cygwinопцию, но distutils еще не догнал ее. Либо установите более старую версию MinGW, либо отредактируйте distutils\cygwinccompiler.pyв своем каталоге Python, чтобы удалить все экземпляры -mno-cygwin.

Игнасио Васкес-Абрамс
источник
10
Спасибо, Игнасио. Я уже пробовал это решение самостоятельно (чтобы исключить -mno-cygwin из cygwinccompyler). Ошибка исчезла, но затем я получил другую ошибку с ld. Но это другой вопрос. Выложу завтра. Теперь нужно немного отдохнуть ... Почему так сложно компилировать в windows?
Хоакин
7
Это то, что у меня сработало. Я дословно выполнил инструкции Игнасио. Заменены 4 экземпляра строки «-mno-cygwin» на «» в файле cygwincompile.py
Рам Нарасимхан
4
@joaquin: Удалось ли вам разобрать полученную ldошибку? Я столкнулся с той же ошибкой и изо всех сил пытаюсь ее разобрать.
robintw 02
@robintw да, я сделал. Я выложил рецепт в тот момент (и нашел!). Пожалуйста, смотрите редактирование
Хоакин 03
2
Python 2.7.9 решил эту проблему. В Python 2.7.8 он все еще есть.
fx-kirin
11

В процессе решения этих и следующих проблем, которые я обнаружил, я написал рецепт в этой ветке . Я воспроизвожу его здесь, если он может быть полезен другим:


Пошаговый рецепт компиляции 64-битных расширений cython с python 2.6.6 с компилятором mingw в 64-битной win 7

Установите компилятор 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: Обратите внимание, что в python 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-битный Python).
Edit 2013: следующие шаги 5-10 можно пропустить, загрузив и установив libpython26.a из gohlke .

5) Получите gendef.exe из mingw-w64-bin_x86_64- mingw_20101003_sezero.zip (gendef.exe недоступен в дистрибутиве tmd64. Другое решение - скомпилировать gendef из исходного кода ...)
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, а о компиляции скрипта cython. Не уверен, что вы это имели в виду. Так или иначе, два дня назад был комментарий от robintw об ошибке ld. Итак, если у вас действительно работает mingw, возможно, это зависит от версии, которую вы устанавливаете, и, возможно, от библиотек, которые вы уже установили, которые вы используете с первого взгляда, или вы застряли с ошибками.
Хоакин 04
1
+1 Это полезный ответ. Для расширений, использующих numpy, мне также пришлось взломать параметры внутри numpy/distutilsпапки, как для mingw32compiler.py.
Калеб Хаттинг,
В python27 кажется, что вам нужно определить MS_WIN64, добавив его в файл cygwinccompiler.py. См. Здесь: stackoverflow.com/a/19867426/2136991
Дэвид
@David в вопросе, который вы связываете, OP относится к python26, а не к python27. Вы в точности следовали моему рецепту и все же нужно было внести изменения, о которых говорите?
Хоакин 08