目录
[1.1 用file命令查看基础版本](#1.1 用file命令查看基础版本)
[1.2 用readelf查看详细版本(推荐)](#1.2 用readelf查看详细版本(推荐))
[三、在代码中打印 FFmpeg 版本](#三、在代码中打印 FFmpeg 版本)
开发过程中经常出现库的版本不匹配导致的各种问题,需要查看库的版本。这里有几种方法,以查看ffmpeg的libavformat.so为例。
一、直接查看动态库文件的版本信息
Linux 系统下,FFmpeg 动态库会内置版本信息,可通过以下命令直接查询:
1.1 用file命令查看基础版本
bash
# 替换为你的FFmpeg动态库路径(比如libavformat.so)
file /usr/lib/x86_64-linux-gnu/libavformat.so
输出
bash
/usr/lib/x86_64-linux-gnu/libavformat.so: symbolic link to libavformat.so.58.76.100
其中58.76.100就是具体版本(对应 FFmpeg 4.4 版本,FFmpeg 的库版本号和主版本有对应关系)。
1.2 用readelf查看详细版本(推荐)
bash
# 查看库的动态符号/版本信息
readelf -d /usr/lib/x86_64-linux-gnu/libavformat.so | grep -i version
# 或查看库内置的版本字符串
objdump -s --section=.rodata /usr/lib/x86_64-linux-gnu/libavformat.so | grep -i "ffmpeg version"
示例输出:
bash
0x000000000000001e (SONAME) Library soname: [libavformat.so.58]
# 或直接显示FFmpeg完整版本
ffmpeg version 4.4.2-0ubuntu0.22.04.1 Copyright (c) 2000-2021 the FFmpeg developers
二、通过pkg-config查询
如果你的系统安装了 FFmpeg 的开发包(包含.pc配置文件),可直接用pkg-config查询:
bash
# 查询单个库的版本(比如avformat)
pkg-config --modversion libavformat
# 同时查询多个核心库版本
pkg-config --modversion libavformat libavcodec libavutil
示例输出:
bash
58.76.100 # avformat版本
58.134.100 # avcodec版本
56.70.100 # avutil版本
三、在代码中打印 FFmpeg 版本
如果想确认当前代码编译 / 链接时使用的 FFmpeg 版本,可以写一个简单的测试程序,利用 FFmpeg 内置的版本宏 / 函数:
cpp
#include <iostream>
// 引入FFmpeg核心头文件
#include <libavutil/version.h>
#include <libavformat/version.h>
#include <libavcodec/version.h>
int main() {
// 1. 打印FFmpeg整体版本(字符串)
std::cout << "FFmpeg version: " << av_version_info() << std::endl;
// 2. 打印各核心库的版本号(数字+字符串)
std::cout << "avutil version: " << AVUTIL_VERSION_MAJOR << "." << AVUTIL_VERSION_MINOR << "." << AVUTIL_VERSION_MICRO
<< " (" << avutil_version() << ")" << std::endl;
std::cout << "avformat version: " << AVFORMAT_VERSION_MAJOR << "." << AVFORMAT_VERSION_MINOR << "." << AVFORMAT_VERSION_MICRO
<< " (" << avformat_version() << ")" << std::endl;
std::cout << "avcodec version: " << AVCODEC_VERSION_MAJOR << "." << AVCODEC_VERSION_MINOR << "." << AVCODEC_VERSION_MICRO
<< " (" << avcodec_version() << ")" << std::endl;
// 3. 检查是否包含av_register_all(判断是否为旧版本)
#if FF_API_REGISTER_ALL
std::cout << "FFmpeg版本 < 4.0,包含av_register_all函数" << std::endl;
#else
std::cout << "FFmpeg版本 ≥ 4.0,已废弃av_register_all函数" << std::endl;
#endif
return 0;
}
编译并运行(需链接 FFmpeg 库):
bash
# 编译命令(替换为你的库路径)
g++ test_ffmpeg_version.cpp -o test_ffmpeg -lavutil -lavformat -lavcodec
# 运行
./test_ffmpeg
cpp
FFmpeg version: 4.4.2
avutil version: 56.70.100 (5670100)
avformat version: 58.76.100 (5876100)
avcodec version: 58.134.100 (58134100)
FFmpeg版本 ≥ 4.0,已废弃av_register_all函数
四、实测
bash
fuh@dell:lib$ file libavformat.so
libavformat.so: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, BuildID[sha1]=5832a1015f0d0c617b125eeeda59a05e1272b41c, stripped
执行 file libavformat.so 后,输出显示这个库是 ARM aarch64 架构的 64 位共享对象,但标注了 stripped(符号 / 调试信息被剥离),所以没有直接显示版本号。针对这种剥离了符号的 FFmpeg 动态库,提供几种可靠的版本查询方法:
4.1通过 readelf 查 SONAME(库版本后缀,最快捷)
bash
readelf -d libavformat.so | grep -i soname
bash
fuh@dell:lib$ readelf -d libavformat.so | grep -i soname
0x000000000000000e (SONAME) Library soname: [libavformat.so.61]
4.2 编写极简测试程序(最准确,不受 stripped 影响)
stripped 仅删除符号表,不影响库的运行时接口,写一个仅链接库并打印版本的程序,就能精准获取版本