编译含FFmpeg头文件的C++代码时遇‘av_register_all未定义引用’错误
解决FFmpeg编译时"Undefined reference to 'av_register_all'"的错误
嘿,这个问题我太熟悉了——你现在只给编译器喂了源码和头文件,但链接阶段根本没告诉它要找FFmpeg的库文件,自然找不到av_register_all的实现啦。
问题根源
你的编译命令g++ -o a a.cpp只完成了编译源码的步骤,但FFmpeg的函数实现都在它的库文件里(比如libavformat.a/libavformat.dll.a这类),链接器需要明确知道这些库的位置和名字才能把它们和你的代码拼起来。
解决步骤
先确认你的FFmpeg库位置
假设你把FFmpeg安装/解压在了D:\ffmpeg,那么:- 头文件目录:
D:\ffmpeg\include(就是你#include的那些.h文件所在的地方) - 库文件目录:
D:\ffmpeg\lib(存放.a/.lib/.dll.a的地方)
- 头文件目录:
修改编译命令,加上库链接参数
把你的命令改成这样(根据你的实际路径调整):g++ -o a a.cpp -ID:\ffmpeg\include -LD:\ffmpeg\lib -lavformat -lavcodec -lswscale -lavutil给你拆解下每个参数的作用:
-ID:\ffmpeg\include:告诉编译器去哪里找FFmpeg的头文件,这样#include "libavformat/avformat.h"才能被正确找到-LD:\ffmpeg\lib:告诉链接器去哪里找FFmpeg的库文件-lavformat:链接avformat库(注意这里要去掉前缀lib和后缀,比如原文件是libavformat.a,只需要写avformat)- 后面的
-lavcodec、-lswscale、-lavutil都是你代码里用到的依赖库,必须一起加上,不然还会出现其他类似的未定义引用错误
额外注意事项
- 确保你的g++(MinGW)和FFmpeg的架构一致:要么都是32位,要么都是64位,跨架构编译肯定会出问题
- 如果用的是FFmpeg动态库(DLL),编译后要把对应的
.dll文件(比如avformat-xx.dll)放到你的程序a.exe同目录下,或者加到系统PATH里,不然运行时会提示找不到DLL - 要是不确定需要链接哪些库,可以查FFmpeg的官方文档,或者根据你用到的函数所属库来添加——比如
av_register_all属于avformat库,所以必须链接-lavformat
内容的提问来源于stack exchange,提问作者Hask
相关产品推荐
相关产品推荐

