La compilation avec cython et mingw produit gcc: erreur: option de ligne de commande non reconnue '-mno-cygwin'

114

J'essaie de compiler une extension python avec cython dans win 7 64 bits en utilisant mingw (64 bits).
Je travaille avec Python 2.6 (Active Python 2.6.6) et avec le fichier distutils.cfg adéquat (définissant mingw comme compilateur)

Lors de l'exécution

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

J'obtiens une erreur disant que gcc n'a pas d'option -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 est:

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

Comment pourrais-je résoudre ce problème?

Joaquin
la source
Voici un lien ! Cela résout le problème avec les derniers Cython et MingW
Indrajit Kanjilal

Réponses:

181

Il semble que GCC 4.7.0 ait finalement supprimé l' -mno-cygwinoption obsolète , mais distutils ne l'a pas encore rattrapée. Installez une version légèrement plus ancienne de MinGW ou modifiez-la distutils\cygwinccompiler.pydans votre répertoire Python pour supprimer toutes les instances de -mno-cygwin.

Ignacio Vazquez-Abrams
la source
10
Merci Ignacio. J'ai déjà essayé cette solution par moi-même (pour éliminer -mno-cygwin de cygwinccompyler). L'erreur a disparu mais j'ai eu une erreur différente avec ld. Mais c'est une autre question. Je le posterai demain. Maintenant besoin de repos ... pourquoi est-il si difficile de compiler sous Windows?
joaquin
7
C'est ce qui a fonctionné pour moi. J'ai suivi les instructions d'Ignacio mot pour mot. Remplacement de 4 instances de la chaîne "-mno-cygwin" par "" dans le fichier cygwincompile.py
Ram Narasimhan
4
@joaquin: Avez-vous réussi à trier l' lderreur que vous avez eue? J'ai rencontré la même erreur et j'ai du mal à la résoudre.
robintw
@robintw oui je l'ai fait. J'ai posté une recette à ce moment-là (et je l'ai trouvée!). S'il vous plaît voir edit
joaquin
2
Python 2.7.9 a résolu ce problème. Python 2.7.8 l'a toujours.
fx-kirin
11

Pendant le processus de résolution de ces problèmes et des problèmes suivants, j'ai écrit une recette dans ce fil . Je le reproduis ici au cas où cela pourrait être utile pour d'autres:


Recette étape par étape pour compiler des extensions cython 64 bits avec python 2.6.6 avec le compilateur mingw dans win 7 64 bits

Installer le compilateur mingw
1) Installer tdm64-gcc-4.5.2.exe pour la compilation 64 bits

Appliquer le correctif à python.h
2) Modifier python.h dans C: \ python26 \ include comme indiqué dans http://bugs.python.org/file12411/mingw-w64.patch

Modifier distutils
Edit 2013: Remarque que dans python 2.7.6 et 3.3.3 -mno-cygwin a finalement été supprimé, donc l'étape 3 peut être ignorée .

3) Eliminer tous les paramètres -mno-cygwin de l'appel à gcc dans la classe Mingw32CCompiler dans Python26 \ Lib \ distutils \ cygwinccompiler.py
4) Dans le même module, modifiez get_msvcr () pour renvoyer une liste vide au lieu de ['msvcr90 '] lorsque msc_ver ==' 1500 '.

Produisez le fichier libpython26.a (non inclus dans python 64 bits)
Edit 2013: les étapes 5 à 10 suivantes peuvent être ignorées en téléchargeant et en installant libpython26.a depuis gohlke .

5) Obtenez gendef.exe à partir de mingw-w64-bin_x86_64- mingw_20101003_sezero.zip (gendef.exe n'est pas disponible dans la distribution tmd64. Une autre solution consiste à compiler gendef à partir des sources ...)
6) Copiez python26.dll (situé à C \ windows \ system32) dans le répertoire utilisateur (C: \ Users \ myname)
7) Produisez le fichier python26.def avec:

gendef.exe C: \ Users \ mon nom \ python26.dll

8) Déplacez le fichier python.def produit (situé dans le dossier à partir duquel gendef a été exécuté) vers le répertoire utilisateur
9) Produisez la libpython.a avec:

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

10) Déplacez le libpython26.a créé vers C: \ Python26 \ libs

Produisez votre extension .pyd
11) Créez un fichier test hello.pyx et un fichier setup.py comme indiqué dans le tutoriel cython ( http://docs.cython.org/src/quickstart/build.html )
12) Compilez avec

python setup.py build_ext --inplace

Terminé!

Joaquin
la source
J'ai fait l'étape 1 sur win64 python27. Ensuite, j'ai essayé et cython installé avec succès. Je ne savais pas quoi faire avec le patch à l'étape 2.
craastad
@Chris Raastad. Intéressant. Mais il ne s'agit pas d'installer cython mais de compiler un script. Je ne sais pas si tu le pensais. Quoi qu'il en soit, il y a deux jours, il y avait un commentaire de robintw à propos de l'erreur ld. Donc, si mingw fonctionne réellement, cela dépend peut-être de la version que vous installez et peut-être des bibliothèques que vous avez déjà installées que vous parcourez au premier coup ou que vous êtes coincé avec des erreurs.
joaquin
1
+1 C'est une réponse utile. Pour les extensions utilisant numpy, j'ai également dû pirater les options dans le numpy/distutilsdossier, à la fois pour mingw32compiler.py.
Caleb Hattingh
En python27, il semble que vous deviez définir MS_WIN64 en l'ajoutant au fichier cygwinccompiler.py. Voir ici: stackoverflow.com/a/19867426/2136991
David
@David dans la question que vous liez l'OP fait référence à python26, pas à python27. Avez-vous suivi exactement ma recette et devez-vous encore effectuer le changement que vous parlez?
joaquin