Mingw64环境编译含FFmpeg的cgo程序时pkg-config报错
我来帮你解决这个MinGW64环境下编译依赖FFmpeg的cgo程序时,pkg-config报错找不到库的问题。从你给出的编译执行信息能看到,go build过程中调用pkg-config去查找libavfilter、libavutil等FFmpeg组件,但没有成功匹配到:
$ go build -x src/github.com/imkira/go-libav/examples/transcoder.go WORK=C:\msys64\tmp\go-build616922114 mkdir -p $WORK\b033\ cd c:\users\chris_000\code\go\src\github.com\imkira\go-libav\avfilter pkg-config --cflags -- libavfilter libavutil mkdir -p $WORK\b030\ cd c:\users\chris_000\code\go\src\github.com\imkira\go-libav\avcodec pkg-config -...
下面是具体的排查和修复步骤:
确认FFmpeg开发包已正确安装到MinGW64
不要使用随便下载的预编译FFmpeg版本,最好通过MinGW64的包管理器(pacman)安装带开发文件的FFmpeg包。打开MinGW64终端,执行:# 64位系统执行这个 pacman -S mingw-w64-x86_64-ffmpeg # 32位系统换成这个 # pacman -S mingw-w64-i686-ffmpeg安装完成后,验证pkg-config能否识别到FFmpeg库:
pkg-config --list-all | grep av如果能输出libavcodec、libavfilter、libavutil等条目,说明安装没问题。
检查并配置PKG_CONFIG_PATH环境变量
pkg-config是通过PKG_CONFIG_PATH环境变量查找库的配置文件(.pc文件)的。如果你的FFmpeg是手动编译安装的,需要把它的pkgconfig目录加到这个变量里:# 假设手动编译的FFmpeg安装在/usr/local/ffmpeg,替换成你的实际路径 export PKG_CONFIG_PATH=/usr/local/ffmpeg/lib/pkgconfig:$PKG_CONFIG_PATH配置后再测试:
pkg-config --cflags libavfilter libavutil如果能输出类似
-I/mingw64/include这样的头文件路径,说明环境变量配置生效了。绕过pkg-config,手动指定cgo参数
如果pkg-config始终无法正常工作,可以直接在Go代码中通过cgo指令手动指定FFmpeg的头文件和库路径。找到你的go-libav相关代码中的cgo注释部分,修改成类似这样:/* #cgo CFLAGS: -I/mingw64/include #cgo LDFLAGS: -L/mingw64/lib -lavfilter -lavutil -lavcodec -lavformat -lswscale -lswresample #include <libavfilter/avfilter.h> #include <libavutil/avutil.h> */ import "C"注意把
/mingw64/include和/mingw64/lib替换成你实际的FFmpeg头文件和库所在路径。确保使用正确的MinGW64终端环境
一定要打开MSYS2提供的MinGW64 Shell(不是普通CMD、PowerShell或者MSYS2 Shell),这个终端会自动配置好MinGW64相关的环境变量。你可以执行echo $PATH检查,确保/mingw64/bin在路径列表中,这样pkg-config和编译器才能找到对应的工具和库。
内容的提问来源于stack exchange,提问作者chris

