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

Windows下用g++编译调用Python.h的C++项目出现未定义引用问题

Windows下g编译调用Python.h的C项目未定义引用问题解决

问题场景

代码示例:

#include <Python.h>

int main(int argc, char **argv)
{
    Py_Initialize();
    PyRun_SimpleString("print('Hello World!')");
    Py_Finalize();
    
    return 0;
}

使用编译命令:
g++ -I C:\Python310\include main.cpp -o output -L C:\Python310\libs -lpython310

出现未定义引用错误:

AppData\Local\Temp\ccQdtubj.o:main.cpp:(.text+0x1f): undefined reference to `_imp__Py_DecodeLocale'
AppData\Local\Temp\ccQdtubj.o:main.cpp:(.text+0x6c): undefined reference to `_imp__Py_SetProgramName'
AppData\Local\Temp\ccQdtubj.o:main.cpp:(.text+0x73): undefined reference to `_imp__Py_Initialize'
AppData\Local\Temp\ccQdtubj.o:main.cpp:(.text+0x8d): undefined reference to `_imp__PyRun_SimpleStringFlags'
AppData\Local\Temp\ccQdtubj.o:main.cpp:(.text+0x94): undefined reference to `_imp__Py_FinalizeEx'
AppData\Local\Temp\ccQdtubj.o:main.cpp:(.text+0xb5): undefined reference to `_imp__PyMem_RawFree'
collect2.exe: error: ld returned 1 exit status

解决步骤

  • 匹配Python与g++的位数:确保安装的Python和使用的g++是同一位数(均为32位或64位),位数不匹配会直接导致链接失败。如果用的是MinGW,建议使用MinGW-w64版本适配64位Python。
  • 转换Python库文件格式:Windows下Python提供的是.lib格式库,而MinGW需要.a格式静态库。用dlltool命令转换:
    dlltool --input-def C:\Python310\libs\python310.def --output-lib libpython310.a --dllname python310.dll
    
    将生成的libpython310.a放入C:\Python310\libs目录。
  • 调整编译命令参数顺序:g++的链接参数需放在源文件之后,正确命令为:
    g++ main.cpp -o output -I C:\Python310\include -L C:\Python310\libs -lpython310
    
  • 添加必要宏定义:在包含Python.h前定义PY_SSIZE_T_CLEAN,避免类型不匹配问题,修改后代码:
    #define PY_SSIZE_T_CLEAN
    #include <Python.h>
    
    int main(int argc, char **argv)
    {
        Py_Initialize();
        PyRun_SimpleString("print('Hello World!')");
        Py_Finalize();
        
        return 0;
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 02:58:17