如何查案动态库版本

目录

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

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

相关推荐
又见野草几秒前
C++类和对象(下)
开发语言·c++
江畔何人初12 分钟前
pod的内部结构
linux·运维·云原生·容器·kubernetes
不做无法实现的梦~21 分钟前
PX4编译环境配置和qgc配置安装教程(2)
linux·stm32
齐鲁大虾24 分钟前
Linux下用什么编程语言方便开发B/S架构程序
linux·运维·架构
春夜喜雨30 分钟前
关于内存分配的优化与设计
c++·tcmalloc·malloc·jemallc
范纹杉想快点毕业37 分钟前
状态机设计与嵌入式系统开发完整指南从面向过程到面向对象,从理论到实践的全面解析
linux·服务器·数据库·c++·算法·mongodb·mfc
三块钱079441 分钟前
群晖docker部署Mattermost,对接openclaw
运维·docker·容器
坚定学代码1 小时前
认识 ‘using namespace‘
c++
博客-小覃1 小时前
内网穿透/端口映射之二层穿透访问”FTP共享文件“示例操作教程
运维·服务器·网络
jiang_changsheng1 小时前
环境管理工具全景图与深度对比
java·c语言·开发语言·c++·python·r语言