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.dlllibpython310.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
相关产品推荐
相关产品推荐

