You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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存在三个关键问题:

  1. 路径反斜杠未转义:Makefile中反斜杠\是续行符,直接写C:\Python27\include会被解析错误,换成正斜杠/或者转义反斜杠\\
  2. 命令行缩进错误:Makefile中规则的命令行必须用Tab键缩进(不能用空格),否则make会识别为无效命令;
  3. 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兼容的导入库

  1. 确认MinGW已安装gendefdlltool(一般MinGW安装时会自带,若没有可通过MinGW包管理器安装);
  2. 打开MinGW终端,进入Python 2.7安装目录,生成.def文件:
    gendef C:/Python27/python27.dll
    
    执行后会得到python27.def文件;
  3. dlltool生成GNU格式的导入库:
    dlltool --dllname python27.dll --def python27.def --output-lib libpython27.a
    
  4. 将生成的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

火山引擎 最新活动