Windows下MinGW编译嵌入Python的C代码遇链接错误求助
解决MinGW编译嵌入Python 2.7的C代码时的链接错误
你遇到的是MinGW与MSVC编译的Python库不兼容导致的未定义引用错误,同时你的Makefile也存在几个细节问题,我来一步步帮你解决:
一、先修正源文件的头文件引用
你的源文件里直接写了#include <C:\Python27\include\Python.h>,这不是规范写法,还会导致路径硬编码。改成:
#include <stdio.h> #include <Python.h>
后续通过Makefile的-I参数指定Python的include目录即可。
二、修正Makefile的核心问题
你的Makefile存在三个关键问题:
- 路径反斜杠未转义:Makefile中反斜杠
\是续行符,直接写C:\Python27\include会被解析错误,换成正斜杠/或者转义反斜杠\\; - 命令行缩进错误:Makefile中规则的命令行必须用Tab键缩进(不能用空格),否则make会识别为无效命令;
- BOM编码问题:错误信息里的
[all]说明你的Makefile带有UTF-8 BOM头,需要用编辑器(比如Notepad++)保存为UTF-8 无BOM格式。
修正后的Makefile示例(用正斜杠路径):
all: HelloWorld.exe HelloWorld.exe: HelloWorld.c @echo Compiling... gcc -Wall -I C:/Python27/include -L C:/Python27/libs -o HelloWorld.exe HelloWorld.c -lpython27
三、解决MinGW与Python MSVC库的兼容性问题
这是你遇到链接错误的核心原因:Python 2.7官方提供的python27.lib是MSVC格式的库文件,而MinGW需要GNU格式的.a导入库,直接链接会出现未定义引用。解决方法如下:
方法1:生成MinGW兼容的导入库
- 确认MinGW已安装
gendef和dlltool(一般MinGW安装时会自带,若没有可通过MinGW包管理器安装); - 打开MinGW终端,进入Python 2.7安装目录,生成
.def文件:
执行后会得到gendef C:/Python27/python27.dllpython27.def文件; - 用
dlltool生成GNU格式的导入库:dlltool --dllname python27.dll --def python27.def --output-lib libpython27.a - 将生成的
libpython27.a复制到C:/Python27/libs目录下,或者在Makefile的-L参数里指定该文件所在目录。
方法2:确认架构匹配
确保你的MinGW和Python 2.7的架构完全一致:
- 如果Python是32位的,必须用32位MinGW编译;
- 如果是64位Python,必须用64位MinGW(比如MinGW-w64)。
架构不匹配也会导致链接时找不到符号。
四、测试编译
完成上述步骤后,在MinGW终端执行make命令,应该就能成功编译出HelloWorld.exe了。运行程序会输出:
Hello World from C Hello World from Python!!!
内容的提问来源于stack exchange,提问作者Felix.A




