如何修复Qt Creator项目链接FFmpeg libav库时的undefined reference错误?
Qt Creator + MinGW64 链接FFmpeg出现大量未定义引用错误
我在Qt Creator项目中使用FFmpeg的libav库时,出现上千条undefined reference to ...错误,只要调用库的方法就会报错,但相同代码在Visual Studio中可以正常运行。我使用的是MinGW64编译器,不清楚问题出在缺少库还是链接方式错误。
项目文件内容
QT -= gui CONFIG += c++11 console CONFIG -= app_bundle # You can make your code fail to compile if it uses deprecated APIs. # In order to do so, uncomment the following line. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 INCLUDEPATH += D:\Programme\ffmpeg-source\ffmpeg-5.1.2\vs2019_build\include SOURCES += \ Main.cpp # Default rules for deployment. qnx: target.path = /tmp/$${TARGET}/bin else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target QMAKE_CXXFLAGS += -D__STDC_CONSTANT_MACROS LIBS += -lMfuuid LIBS += -lStrmiids LIBS += -lMfplat LIBS += -lBcrypt LIBS += -lSecur32 LIBS += -lWs2_32 LIBS += -pthread LIBS += -L\"D:\\Programme\\ffmpeg-source\\ffmpeg-5.1.2\\vs2019_build\\lib\" LIBS += -lavdevice LIBS += -lavfilter LIBS += -lavformat LIBS += -lavcodec LIBS += -lswresample LIBS += -lswscale LIBS += -lavutil HEADERS += \ wrapper.h
错误示例(截取部分)
:-1: Fehler: D:\Programme\ffmpeg-source\ffmpeg-5.1.2\vs2019_build\lib/libavformat.a(libavformat/aviobuf.o):(.text$mn+0x16): undefined reference to `__security_cookie' :-1: Fehler: D:\Programme\ffmpeg-source\ffmpeg-5.1.2\vs2019_build\lib/libavformat.a(libavformat/aviobuf.o):(.xdata[$unwind$ff_read_string_to_bprint_overwrite]+0x1c): more undefined references to `__GSHandlerCheck' follow :-1: Fehler: D:\Programme\ffmpeg-source\ffmpeg-5.1.2\vs2019_build\lib/libavformat.a(libavformat/4xm.o):(.text$mn+0x250): undefined reference to `__security_check_cookie' :-1: Fehler: D:\Programme\ffmpeg-source\ffmpeg-5.1.2\vs2019_build\lib/libavformat.a(libavformat/yuv4mpegdec.o):(.text$mn+0x2fe): undefined reference to `sscanf' :-1: Fehler: D:\Programme\ffmpeg-source\ffmpeg-5.1.2\vs2019_build\lib/libavformat.a(libavformat/yuv4mpegdec.o):(.text$mn+0x33f): undefined reference to `sscanf' :-1: Fehler: D:\Programme\ffmpeg-source\ffmpeg-5.1.2\vs2019_build\lib/libavformat.a(libavformat/yuv4mpegdec.o):(.text$mn+0x65b): undefined reference to `__report_rangecheckfailure' ...
核心问题与解决思路
核心原因
你当前链接的是VS2019编译的FFmpeg库,但使用的是MinGW64编译器——MSVC和MinGW属于不同的编译工具链,ABI(应用二进制接口)不兼容:
- MSVC特有的安全检查符号(如
__security_cookie、__GSHandlerCheck)是MinGW环境中没有的; - 两者的函数符号命名规则、标准库实现也存在差异,导致链接时无法找到对应符号。
解决步骤
替换FFmpeg库
下载或编译MinGW版本的FFmpeg库,确保库的编译工具链和Qt Creator使用的MinGW64一致:- 可直接获取FFmpeg官方提供的MinGW预编译包;
- 自行编译的话,用MinGW的
configure脚本配置,示例命令:./configure --prefix=/path/to/your/output --enable-shared --disable-static --toolchain=mingw64 make && make install
调整项目配置
- 更新
INCLUDEPATH和LIBS中的路径,指向MinGW版本FFmpeg的include和lib目录; - 移除MSVC特有的库链接:
-lMfuuid、-lStrmiids、-lMfplat这些是Windows Media Foundation的MSVC专属库,MinGW环境下无需添加; - 保留必要的系统库链接:
-lBcrypt、-lSecur32、-lWs2_32、-pthread可根据MinGW库的实际依赖调整。
- 更新
检查编译选项
确保QMAKE_CXXFLAGS中的宏定义适配MinGW,-D__STDC_CONSTANT_MACROS可以保留,无需添加MSVC相关的编译参数。
内容的提问来源于stack exchange,提问作者VCoder12345
相关产品推荐
相关产品推荐

