Bash构建项目迁移CMake: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

