如何查案动态库版本

目录

一、直接查看动态库文件的版本信息

[1.1 用file命令查看基础版本](#1.1 用file命令查看基础版本)

[1.2 用readelf查看详细版本(推荐)](#1.2 用readelf查看详细版本(推荐))

二、通过pkg-config查询

[三、在代码中打印 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 仅删除符号表,不影响库的运行时接口,写一个仅链接库并打印版本的程序,就能精准获取版本

相关推荐
贵州诚鑫致达科技有限公司5 小时前
Linux的yum源怎么重启?源不是服务
linux·运维·服务器
遇印记6 小时前
传输层,网络层
运维·服务器·网络·windows·学习
品牌常新6 小时前
景区巡逻机器人怎么选?派宝S5全地形守护解析
运维·人工智能·机器人
Elastic 中国社区官方博客7 小时前
一条 ES|QL 查询,涵盖365天的审计日志:在热数据和可搜索快照上执行相同的搜索
大数据·运维·服务器·elasticsearch·搜索引擎·全文检索
WL学习笔记8 小时前
C & C++ 内存管理
c++·c++内存管理
澜山奕秋8 小时前
RHCSA
linux·运维·服务器
Web极客码9 小时前
告别流式截断:我用客户端中间件解决长文本 API 跨国 SSE 断连与数据自愈
linux·agent 图
cnnews9 小时前
Chromebox3安装Ubuntu后内存化与最小化 eMMC 写入优化
linux·运维·ubuntu
AliCloudROS9 小时前
OOS ChatOps Agent 定时任务:每天 9 点,让Agent 在钉钉群里交运维报告
运维·自动化运维