通过GCC在Win64上编写Python扩展

8 投票
3 回答
3968 浏览
提问于 2025-04-16 04:30

有没有人成功用mingw64在Windows上编译64位的Python扩展模块?

我已经用VS2008成功编译了这个扩展模块,也用mingw32(配合32位的Python)编译过。我更希望两个版本都能用GCC来编译。

我通过Cygwin安装了mingw64-x86_64-w64 GCC 4.5.1工具集,并让Python使用它们。不过,链接到Python本身的时候失败了。

于是我下载了pexports 0.44,用它生成了一个python26.def文件,并创建了libpython26.a

现在,正如在这个问题中提到的,我从Python得到的唯一链接错误是关于__imp_py_InitModule4的。在查看def文件时,我发现里面有一个Py_InitModule4_64的符号。

有什么想法吗?

3 个回答

0

请查看Cython维基上的64位Cython扩展在Windows上的内容。他们不建议使用MinGW-64。

4

我发现你需要同时定义 MS_WIN64 和 WIN32,另外 distutils 这个包不支持 mingw64,具体可以看看 这个帖子这个帖子

要让 distutils 支持 mingw64,其实改动并不复杂。

3

在Python中,有一种机制可以防止将模块链接到错误版本的库。当库或模块为64位架构编译时,Py_InitModule4函数会通过一个宏被重命名为Py_InitModule4_64(可以在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

所以,如果你遇到这个错误,说明你的Python库或者Python模块是为32位架构编译的,而另一个则是为64位架构编译的。

撰写回答