You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复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环境中没有的;
  • 两者的函数符号命名规则、标准库实现也存在差异,导致链接时无法找到对应符号。

解决步骤

  1. 替换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
      
  2. 调整项目配置

    • 更新INCLUDEPATH和LIBS中的路径,指向MinGW版本FFmpeg的include和lib目录;
    • 移除MSVC特有的库链接:-lMfuuid、-lStrmiids、-lMfplat这些是Windows Media Foundation的MSVC专属库,MinGW环境下无需添加;
    • 保留必要的系统库链接:-lBcrypt、-lSecur32、-lWs2_32、-pthread可根据MinGW库的实际依赖调整。
  3. 检查编译选项
    确保QMAKE_CXXFLAGS中的宏定义适配MinGW,-D__STDC_CONSTANT_MACROS可以保留,无需添加MSVC相关的编译参数。

内容的提问来源于stack exchange,提问作者VCoder12345

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 07:50:18