如何查案动态库版本

目录

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

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

相关推荐
Vallelonga2 小时前
使用 busybox 制作磁盘镜像文件
linux·经验分享
EndingCoder2 小时前
索引类型和 keyof 操作符
linux·运维·前端·javascript·ubuntu·typescript
小六子成长记2 小时前
【C++】:搜索二叉树的模拟实现
数据结构·c++·算法
汉克老师2 小时前
GESP2025年9月认证C++二级真题与解析(编程题1(优美的数字))
c++·算法·整除·枚举算法·求余·拆数
liux35282 小时前
Web集群管理实战指南:从架构到运维
运维·前端·架构
石小千2 小时前
Linux清除缓存
linux·运维
weixin_516023072 小时前
VESTA在Linux下的安装
linux·运维·服务器
有味道的男人2 小时前
平衡接入京东关键词API利弊的核心策略
大数据·运维
江湖有缘2 小时前
从零开始:基于 Docker Compose部署高可用 Miniflux RSS阅读器
运维·docker·容器