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

Bash构建项目迁移CMake:FFmpeg共享库链接未定义引用报错

FFmpeg库链接未定义引用问题排查思路
  • 检查CMake中链接库的顺序是否正确
    FFmpeg的库之间存在依赖关系,链接时必须遵循先写依赖方、后写被依赖方的规则。如果你的链接命令里把libavutil放在了其他FFmpeg库前面,可能导致符号无法解析。尝试调整链接顺序,确保avutil处于符合依赖链的位置。

  • 验证链接时是否指向正确的libavutil.so
    用ldd命令检查生成的可执行文件,确认它指向的是你编译的FFmpeg库,而非系统自带版本。执行:ldd ./your_app,查看libavutil.so的路径是否为你指定的构建目录,而非/usr/lib这类系统路径。

  • 排查C/C函数签名兼容问题
    av_strcasecmp是C语言函数,在C
    代码中调用时必须用extern "C"包裹头文件,否则编译器会按C++名字修饰规则生成符号,和库中的C符号不匹配。
    检查你的app.cpp是否正确处理:

    extern "C" {
    #include <libavutil/avstring.h>
    }
    

    可以用nm -D libavutil.so | grep av_strcasecmp查看库中的C风格符号,再用nm app.o | grep av_strcasecmp查看目标文件中的符号,若出现C++修饰后的名字(比如_Z12av_strcasecmpPKcS0_),说明缺少extern "C"。

  • 确认CMake链接配置的正确性
    检查CMakeLists.txt的关键配置:

    • include_directories是否指向FFmpeg头文件目录
    • link_directories是否指向FFmpeg库文件目录(非标准路径时需要设置)
    • target_link_libraries是否明确指定了avutil,例如:
      target_link_libraries(your_app PRIVATE avutil)
      

    开启CMake详细输出:cmake --build . --verbose,查看实际链接命令是否包含-lavutil和正确的-L参数指向你的库目录。

  • 检查FFmpeg编译配置选项
    虽然你确认库中有该函数,仍可检查FFmpeg编译日志,确认av_strcasecmp未被--disable-avstring之类的选项禁用。另外验证FFmpeg编译的是共享库(你使用的是libavutil.so,这条作为补充验证)。

  • 验证编译器架构匹配
    确认应用程序和FFmpeg库是相同架构(如均为x86_64或arm64),架构不匹配也会导致符号未定义。执行file libavutil.so和file app.o,查看两者的架构信息是否一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 01:19:53