Компіляція з 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
Індражіт Канджилал

Відповіді:


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

@robintw так, я зробив. Я опублікував рецепт у той момент (І я знайшов його!). Перегляньте редагування
joaquin

2
Python 2.7.9 вирішив цю проблему. У Python 2.7.8 все ще є.
fx-kirin

11

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


Покроковий рецепт для компіляції 64-розрядних розширень cython з python 2.6.6 з компілятором mingw у win 7 64-розрядний

Встановити компілятор mingw
1) Встановити tdm64-gcc-4.5.2.exe для 64-бітної компіляції

Застосувати патч до python.h
2) Змініть python.h в C: \ python26 \ включайте, як зазначено в http://bugs.python.org/file12411/mingw-w64.patch

Змінення distutils
Edit 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)
Редагувати 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 - ім'я python26.dll --def C: \ Користувачі \ моє ім'я \ python26.def --output-lib C: \ Користувачі \ моє ім'я \ 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 --інсталяція

Готово!


Я зробив крок 1 на win64 python27. Потім я спробував і cython встановлений успішно. Я не мав уявлення, що робити з патчем на кроці 2.
craastad

@Chris Raastad. Цікаво. Але мова йде не про встановлення cython, а про компіляцію сценарію cython. Не впевнений, чи ти це мав на увазі. У будь-якому разі, два дні тому з Robintw з'явився коментар про помилку ld. Отже, якщо у вас фактично працює mingw, можливо, це залежить від встановленої версії та, можливо, бібліотек, які ви вже встановили, ви переходите на перший знімок або ви застрягли в помилках.
Жоакін

1
+1 Це корисна відповідь. Для розширень, що використовують numpy, мені також довелося зламати параметри всередині numpy/distutilsпапки, обидва для mingw32compiler.py.
Калеб Хаттінгх

У python27, здається, вам потрібно визначити MS_WIN64, додавши його до файлу cygwinccompiler.py. Дивіться тут: stackoverflow.com/a/19867426/2136991
Девід

@David у запитанні, яке ви посилаєте на OP, стосується python26, а не python27. Ви точно дотримувались мого рецепту і все ще потрібні, щоб внести зміни, на які ви посилаєтесь?
Жоакін


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.