Extensions Python pour Win64 via GCC

Quelqu’un at-il eu de la chance avec la compilation de modules d’extension Python 64 bits pour Windows en utilisant mingw64?

J’ai compilé avec succès l’extension en question avec VS2008 pour cette plate-forme. Je l’ai également compilé avec mingw32 (avec un python 32 bits). Je préférerais que les deux versions utilisent GCC.

J’ai installé le jeu d’outils mingw64-x86_64-w64 GCC 4.5.1 en utilisant Cygwin et j’ai convaincu Python de les utiliser. Cependant, la liaison à python lui-même a échoué.

J’ai donc pris pexports 0.44, je l’ai utilisé pour extraire un fichier python26.def et créer libpython26.a .

Maintenant, comme dans cette question , la seule erreur de lien que je reçois de Python concerne __imp_py_InitModule4 . En parcourant le fichier def, je vois un symbole Py_InitModule4_64 .

Des idées?

Il existe un mécanisme en Python pour empêcher la liaison d’un module avec la mauvaise version de la bibliothèque. La fonction Py_InitModule4 est renommée en Py_InitModule4_64 (via une macro) lorsque la bibliothèque / module est compilée pour une architecture 64 bits (voir modsupport.h):

 #if SIZEOF_SIZE_T != SIZEOF_INT /* On a 64-bit system, rename the Py_InitModule4 so that 2.4 modules cannot get loaded into a 2.5 interpreter */ #define Py_InitModule4 Py_InitModule4_64 #endif 

Donc, si vous obtenez cette erreur, cela signifie que votre bibliothèque Python ou votre module Python est compilé pour une architecture 32 bits, tandis que l’autre est compilé pour une architecture 64 bits.

Je trouve que vous devez définir MS_WIN64 ainsi que Win32, aussi le paquet distutils ne comprend pas mingw64, voir ce post, et celui- ci

Corriger les distutils pour supporter mingw64 est assez sortingvial.

Voir 64BitCythonExtensionsOnWindows sur le wiki Cython. Ils déconseillent d’utiliser MinGW-64.