You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows 10下编译Python模块C代码失败及64位编译报错求助

64位Windows下Python C扩展编译失败的问题解决

错误原因梳理

1. MinGW编译时的链接错误与警告

  • struct timeval警告:Windows下缺少<winsock2.h>头文件,Python的pytime.h引用了struct timeval但未包含定义该结构的头文件。
  • 未定义符号错误(_imp__PyArg_ParseTuple等):
    • MinGW的位数与64位Python不匹配(比如用了32位MinGW编译64位扩展)。
    • Python 3.8+在Windows下的库链接需要额外处理,直接链接python311.lib可能无法正确解析导入符号。

2. Visual Studio编译时的位数冲突

  • LNK4272警告明确说明:使用的是32位编译环境(x86),但Python库是64位(x64),位数不匹配导致链接失败。

解决步骤

一、针对Visual Studio(官方推荐)

  1. 启动对应位数的开发者Shell
    若安装的是64位Python 3.11,必须打开x64 Native Tools Command Prompt for VS(而非x86版本),确保编译环境与Python位数一致。
  2. 修正编译命令
    执行以下命令(路径需匹配你的Python实际安装位置):
    cl /LD /I"C:\Program Files\Python311\include" custom_keyboard.c /link /LIBPATH:"C:\Program Files\Python311\libs" python311.lib /OUT:custom_keyboard.pyd
    
    • 必须显式指定python311.lib,避免链接器找不到符号。

二、针对MinGW-w64(64位版本)

  1. 确保使用64位MinGW-w64
    安装x86_64架构的MinGW-w64,可通过gcc -v验证,输出包含x86_64-w64-mingw32即为64位版本。
  2. 修正C代码(解决timeval警告)
    在Windows专属头文件块中添加<winsock2.h>,因为struct timeval定义在该头文件中:
    #ifdef _WIN32
    // Windows specific includes
    #include <winsock2.h>
    #include <conio.h>
    #endif
    
  3. 修正编译命令
    使用以下命令编译:
    gcc -shared -o custom_keyboard.pyd -I"C:/Program Files/Python311/include" -L"C:/Program Files/Python311/libs" -lpython311 -lws2_32 custom_keyboard.c
    
    • 添加-lws2_32链接Windows套接字库,匹配新增的<winsock2.h>头文件依赖。

三、代码的额外修正(模块名一致性)

模块定义中的名称需与.pyd文件名一致,否则Python无法正确导入。修改模块定义:

static struct PyModuleDef keyboardModule = {
    PyModuleDef_HEAD_INIT,
    "custom_keyboard",  // 改为与输出的pyd文件名一致
    NULL,
    -1,
    keyboardMethods};

内容的提问来源于stack exchange,提问作者Muddyblack k

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 14:27:13