Comment puis-je construire mon C extensions avec MinGW-w64 en Python?

J'ai donc un peu de Python, C extensions j'ai déjà construit et utilisé en 32 bits Python exécute dans Win7. J'ai toutefois passé à 64 bits Python, et je vais avoir des problèmes de construction de l'extension de do avec MinGW-w64.

J'ai fait les modifications distutils comme par ce post, mais j'obtiens des erreurs bizarres suggérant que quelque chose est faux:

$ python setup.py build
running build
running build_ext
building 'MyLib' extension
c:\MinGW64\bin\x86_64-w64-mingw32-gcc.exe -mdll -O -Wall -Ic:\Python27\lib\site-packages\numpy\core\include -Ic:\Python27\include -Ic:\Python27\PC -c MyLib.c -o build\temp.win-amd64-2.7\Release\mylib.o
MyLib.c: In function 'initMyLib':
MyLib.c:631:5: warning: implicit declaration of function 'Py_InitModule4_64' [-Wimplicit-function-declaration]
writing build\temp.win-amd64-2.7\Release\MyLib.def
c:\MinGW64\bin\x86_64-w64-mingw32-gcc.exe -shared -s build\temp.win-amd64-2.7\Release\mylib.o build\temp.win-amd64-2.7\Release\MyLib.def -Lc:\Python27\libs -Lc:\Python27\PCbuild\amd64 -lpython27 -o build\lib.win-amd64-2.7\MyLib.pyd
build\temp.win-amd64-2.7\Release\mylib.o:MyLib.c:(.text+0x13d): undefined reference to `__imp_PyExc_ValueError'
build\temp.win-amd64-2.7\Release\mylib.o:MyLib.c:(.text+0x1275): undefined reference to `__imp_PyExc_ValueError'
build\temp.win-amd64-2.7\Release\mylib.o:MyLib.c:(.text+0x1eef): undefined reference to `__imp_PyExc_ImportError'
build\temp.win-amd64-2.7\Release\mylib.o:MyLib.c:(.text+0x1f38): undefined reference to `__imp_PyExc_AttributeError'
build\temp.win-amd64-2.7\Release\mylib.o:MyLib.c:(.text+0x1f4d): undefined reference to `__imp_PyCObject_Type'
build\temp.win-amd64-2.7\Release\mylib.o:MyLib.c:(.text+0x1f61): undefined reference to `__imp_PyExc_RuntimeError'
build\temp.win-amd64-2.7\Release\mylib.o:MyLib.c:(.text+0x1fc7): undefined reference to `__imp_PyExc_RuntimeError'
build\temp.win-amd64-2.7\Release\mylib.o:MyLib.c:(.text+0x1ffe): undefined reference to `__imp_PyExc_RuntimeError'
build\temp.win-amd64-2.7\Release\mylib.o:MyLib.c:(.text+0x2042): undefined reference to `__imp_PyExc_RuntimeError'
build\temp.win-amd64-2.7\Release\mylib.o:MyLib.c:(.text+0x206c): undefined reference to `__imp_PyExc_RuntimeError'
build\temp.win-amd64-2.7\Release\mylib.o:MyLib.c:(.text+0x208a): more undefined references to `__imp_PyExc_RuntimeError' follow
build\temp.win-amd64-2.7\Release\mylib.o:MyLib.c:(.text+0x20a7): undefined reference to `__imp_PyExc_ImportError'
collect2.exe: error: ld returned 1 exit status
error: command 'x86_64-w64-mingw32-gcc' failed with exit status 1

J'ai googlé autour un peu pour trouver des informations, mais il n'est pas facile de trouver une réponse définitive. Quelqu'un pourrait-il éclairer sur ce point? Quelles modifications dois-je faire pour être en mesure de réussir à construire C les extensions 64 bits Python dans Win7?

EDIT:

Après quelques renseignements utiles dans cgohlke les commentaires ci-dessous, j'ai réussi à générer libpython27.a. Cependant suivant les conseils sur ce post (2ème à la dernière) j'ai toujours eu la __imp_Py_InitModule4_64 erreur. Après quelques graves Google-fu, j'ai réussi à trébucher sur ce post de me dire de le renommer la Py_InitModule4 ligne Py_InitModule4_64. Après que tout a fonctionné à merveille.

  • Vous devez créer libpython27.a avec gendef.exe python27.dll et dlltool.exe --dllname python27.dll --def python27.def --output-lib libpython27.a et le placer dans C:\Python27\libs
  • J'ai vu quelques posts mentionnant gendef. Mais il n'est pas facile de trouver des informations sur la façon d'aller sur la génération de la libpython27.un fichier. Auriez-vous par hasard pour connaître de tout?
  • Ah ok, gendef et dlltool sont deux commandes différentes. Vais essayer. Merci.
  • Ok, il a compilé tous droit, mais lorsque j'essaie d'importer le module-je obtenir Traceback (most recent call last): File "<stdin>", line 1, in <module> ImportError: DLL load failed: The specified procedure could not be found. je pense que quelque part je doit manquer un fichier. La seule chose que j'ai fait avec le gendef des trucs a mettre libpython27.a dans C:\Python27\libs. Ai-je raté quelque chose?
  • Je suis donc passé par toutes les étapes que par ceci post (2e à partir de la bas). Mais maintenant, il ne compile pas, et je reçois ce build\temp.win-amd64-2.7\Release\cquant.o:cQuant.c:(.text+0x1f09): undefined reference to __imp_Py_InitModule4_64' collect2.exe: erreur: ld a retourné 1 code de sortie`
  • Hmm donc, il y a quelque chose qui peut être fait à ce sujet, ou vais-je avoir à admettre la défaite?
  • J'ai essayé le -DMS_WIN64 drapeau trop, mais j'ai toujours l'erreur. Je ne comprends vraiment pas pourquoi il devrait être si difficile à compiler en 64 bits Python lors de la 32 bits est très simple et direct. Merci pour l'aide, beaucoup apprécié.
  • J'ai enfin réussi à faire le tri. J'ai juste eu à renommer le Py_InitModule4 ligne Py_InitModule4_64 dans le python27.def fichier. Merci beaucoup pour l'aide. Si vous arrive d'être la cgohlke derrière ce site, merci pour celui-là aussi, ces binaires ont été un énorme aider de temps en temps 🙂
  • Pourquoi êtes-vous ensemble sur mingw-w64? pouvez-vous utiliser les visual c++ 2008 express sp1 kit de développement logiciel windows 7 pour .net frameworks 3.5 sp1 et l'utilisation setenv /release /x64, set DISTUTILS_USE_SDK=1, set MSSdk=1 et pip install blah ou la méthode d'installation de votre choix.
  • Je ne me rappelle pas les détails exacts, mais il y avait quelque chose avec mon code que Visual C++ 2008 n'aimais pas (C99 lié je pense). Normalement, je voudrais juste changer le code, mais le même code est utilisé sur une machine Linux ainsi. Donc, c'est une longue histoire courte, je mis la mingw-w64 de l'environnement jusqu'à la place pour que je puisse avoir la même base de code tout au long de.