基于FFmpeg的C程序因共享库问题运行异常求助
FFmpeg转码程序运行异常排查
项目背景
基于FFmpeg官方transcode.c实现的转码示例项目,编译后运行出现异常。
初始错误:共享库加载失败
直接运行编译后的程序时,报错无法找到libswresample.so.4:
FFMpeg_MJPEG-transcode-VP9_C_Universe$ myExample/build-host/myExample myExample/build-host/myExample: error while loading shared libraries: libswresample.so.4: cannot open shared object file: No such file or directory
但程序的RUNPATH已正确指向包含该库的目录:
chrpath -l myExample/build-host/myExample myExample/build-host/myExample: RUNPATH=/home/q/FFMpeg_MJPEG-transcode-VP9_C_Universe/FFMpeg_themself/FFmpeg_build/lib
该目录下确实存在目标库文件:
FFMpeg_MJPEG-transcode-VP9_C_Universe/FFMpeg_themself/FFmpeg_build/lib$ ls libavcodec.a libavdevice.a libavfilter.a libavformat.a libavutil.a libswresample.a libswscale.a pkgconfig libavcodec.so libavdevice.so libavfilter.so libavformat.so libavutil.so libswresample.so libswscale.so libavcodec.so.60 libavdevice.so.60 libavfilter.so.9 libavformat.so.60 libavutil.so.58 libswresample.so.4 libswscale.so.7 libavcodec.so.60.26.100 libavdevice.so.60.2.101 libavfilter.so.9.11.100 libavformat.so.60.12.100 libavutil.so.58.24.100 libswresample.so.4.11.100 libswscale.so.7.3.100
修复尝试后的新错误:段错误
尝试通过LD_LIBRARY_PATH指定库路径后,库加载问题解决,但出现段错误:
FFMpeg_MJPEG-transcode-VP9_C_Universe$ LD_LIBRARY_PATH=/home/q/FFMpeg_MJPEG-transcode-VP9_C_Universe/FFMpeg_themself/FFmpeg_build/lib myExample/build-host/myExample Cannot open input file Segmentation fault (core dumped)
错误溯源到libavformat的avformat_open_input()函数。
再尝试通过ldconfig配置系统级库路径:
FFMpeg_MJPEG-transcode-VP9_C_Universe$ sudo bash -c 'cat <<EOF > /etc/ld.so.conf.d/myFFMpeg.conf #My path to my FFMpeg build ${PWD}/FFMpeg_themself/FFmpeg_build/lib EOF' sudo ldconfig -v
测试后仍出现相同段错误,但Qt Creator直接运行程序无异常。
辅助诊断日志
ldd依赖检测输出
FFMpeg_MJPEG-transcode-VP9_C_Universe$ ldd myExample/build-host/myExample linux-vdso.so.1 (0x00007ffd7e38a000) libavcodec.so.60 => /home/q/FFMpeg_MJPEG-transcode-VP9_C_Universe/FFMpeg_themself/FFmpeg_build/lib/libavcodec.so.60 (0x00007efd63e00000) libavutil.so.58 => /home/q/FFMpeg_MJPEG-transcode-VP9_C_Universe/FFMpeg_themself/FFmpeg_build/lib/libavutil.so.58 (0x00007efd62c00000) libavformat.so.60 => /home/q/FFMpeg_MJPEG-transcode-VP9_C_Universe/FFMpeg_themself/FFmpeg_build/lib/libavformat.so.60 (0x00007efd62800000) libavfilter.so.9 => /home/q/FFMpeg_MJPEG-transcode-VP9_C_Universe/FFMpeg_themself/FFmpeg_build/lib/libavfilter.so.9 (0x00007efd62400000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007efd62000000) libswresample.so.4 => not found libvpx.so.7 => /lib/x86_64-linux-gnu/libvpx.so.7 (0x00007efd61c00000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007efd6507f000) /lib64/ld-linux-x86-64.so.2 (0x00007efd6517a000) libswscale.so.7 => not found libswresample.so.4 => not found
CMake编译配置日志
FFMpeg_MJPEG-transcode-VP9_C_Universe$ cmake -G Ninja -DCMAKE_BUILD_TYPE:STRING=Debug -S myExample/src/ -B myExample/build-host/ --fresh -- The C compiler identification is GNU 12.3.0 -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Check for working C compiler: /usr/bin/cc - skipped -- Detecting C compile features -- Detecting C compile features - done I found /home/q/FFMpeg_MJPEG-transcode-VP9_C_Universe/FFMpeg_themself/FFmpeg_build/ -- Found PkgConfig: /usr/bin/pkg-config (found version "1.8.1") -- Checking for modules 'libavcodec;libavutil;libavformat;libswresample;libswscale;libavfilter' -- Found libavcodec, version 60.26.100 -- Found libavutil, version 58.24.100 -- Found libavformat, version 60.12.100 -- Found libswresample, version 4.11.100 -- Found libswscale, version 7.3.100 -- Found libavfilter, version 9.11.100 -- Configuring done -- Generating done -- Build files have been written to: /home/q/FFMpeg_MJPEG-transcode-VP9_C_Universe/myExample/build-host
本地编译FFmpeg运行日志
FFMpeg_MJPEG-transcode-VP9_C_Universe$ LD_LIBRARY_PATH=/home/q/FFMpeg_MJPEG-transcode-VP9_C_Universe/FFMpeg_themself/FFmpeg_build/lib FFMpeg_themself/bin/ffmpeg ffmpeg version N-112061-g654e4b00e2 Copyright (c) 2000-2023 the FFmpeg developers built with gcc 12 (Ubuntu 12.3.0-1ubuntu1~23.04) configuration: --prefix=/home/q/FFMpeg_MJPEG-transcode-VP9_C_Universe/FFMpeg_themself/FFmpeg_build --pkg-config-flags=--static --extra-cflags=-I/home/q/FFMpeg_MJPEG-transcode-VP9_C_Universe/FFMpeg_themself/FFmpeg_build/include --extra-ldflags=-L/home/q/FFMpeg_MJPEG-transcode-VP9_C_Universe/FFMpeg_themself/FFmpeg_build/lib --extra-libs='-lpthread -lm' --ld=g++ --bindir=../bin --disable-x86asm --enable-libvpx --enable-shared libavutil 58. 24.100 / 58. 24.100 libavcodec 60. 26.100 / 60. 26.100 libavformat 60. 12.100 / 60. 12.100 libavdevice 60. 2.101 / 60. 2.101 libavfilter 9. 11.100 / 9. 11.100 libswscale 7. 3.100 / 7. 3.100 libswresample 4. 11.100 / 4. 11.100 Hyper fast Audio and Video encoder usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...
核心矛盾点
- RUNPATH已指向库目录,但仍出现
libswresample.so.4找不到的错误; - 解决库加载问题后,程序在
avformat_open_input()处触发段错误; - Qt Creator直接运行无异常,说明终端运行环境与IDE环境存在差异。
内容的提问来源于stack exchange,提问作者Andrei Cherniaev
相关产品推荐
相关产品推荐

