8

Has anyone had any luck with compiling 64-bit Python extension modules for Windows using mingw64?

I have successfully compiled the extension in question with VS2008 for this platform. I've also compiled it with mingw32 (with a 32-bit python). I would prefer both builds to use GCC.

I've installed the mingw64-x86_64-w64 GCC 4.5.1 set of tools using Cygwin and convinced Python to use them. However, linking to python itself failed.

So I picked up pexports 0.44, used it to dump out a python26.def file and create libpython26.a.

Now, as in this question, the only link error I'm getting from Python is about __imp_py_InitModule4. Browsing through the def file, I see a Py_InitModule4_64 symbol.

Any ideas?

Community
  • 1
  • 1
kenm
  • 23,127
  • 2
  • 43
  • 62
  • 2
    I'd suggest you ask the mingw-w64 project for help. They're usually very responsive... – F'x Oct 01 '10 at 08:02

3 Answers3

4

I find you need to define MS_WIN64 as well as WIN32, also the distutils package does not understand mingw64, see this post, and this one

Patching distutils to support mingw64 is fairly trivial.

Amar Palsapure
  • 9,590
  • 1
  • 27
  • 46
3

There is a mechanism in Python to prevent linking a module against the wrong version of the library. The Py_InitModule4 function is renamed to Py_InitModule4_64 (via a macro) when the library / module is compiled for a 64-bit architecture (see 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

So, if you're getting this error, this means either your Python library, or your Python module is compiled for a 32-bit architecture while the other one is compiled for a 64-bit architecture.

Sylvain Defresne
  • 42,429
  • 12
  • 75
  • 85
0

See 64BitCythonExtensionsOnWindows on the Cython wiki. They recommend against using MinGW-64.

Amit Moscovich
  • 2,858
  • 1
  • 21
  • 12