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?


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.


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é!


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


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.