2010-09-23 18 views
8

Est-ce que quelqu'un a eu de la chance avec la compilation de modules d'extension Python 64 bits pour Windows en utilisant mingw64?Extensions Python pour Win64 via GCC

J'ai réussi à compiler 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é l'ensemble d'outils mcgw64-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é.

Donc, j'ai ramassé pexports 0.44, utilisé pour vider un fichier python26.def et créer libpython26.a.

Maintenant, comme dans this question, la seule erreur de liaison que j'obtiens de Python est d'environ __imp_py_InitModule4. En parcourant le fichier def, je vois un symbole Py_InitModule4_64.

Des idées?

+2

Je vous suggère de demander l'aide du projet mingw-w64. Ils sont généralement très réactifs ... –

Répondre

3

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é Py_InitModule4_64 (via une macro) est compilé lorsque la bibliothèque/module 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, cette signifie soit votre bibliothèque Python, soit votre module Python est compilé pour une architecture 32 bits tandis que l'autre est compilé pour une architecture 64 bits.

4

Je vous trouve besoin de définir MS_WIN64 ainsi que WIN32, aussi le paquet distutils ne comprend pas mingw64, voir this après, et this un

Patcher distutils pour soutenir mingw64 est assez trivial.