对于经常在Linux环境下做开发或者运维的朋友来说,查看某个库的版本是再常见不过的需求了。无论是排查依赖冲突,还是确认编译环境是否满足要求,都需要准确知道当前系统里装了什么版本的库。很多人一上来就用 ldconfig -p 或者去翻 /usr/lib 目录,但实际操作中linux查看库版本,不同场景下查看库版本的方法差别很大。

如何查看已安装的动态库版本

动态链接库(.so文件)是Linux下最常见的库形式。查看这类库版本,最直接的方法是查看库文件本身的命名。许多.so文件会在文件名中直接包含版本号,比如 libssl.so.1.1libcurl.so.4.8.0。你可以在 /usr/lib/usr/lib64/usr/local/lib 等目录下用 ls 命令看到这些文件。

linux查看库版本_linux查看库函数_linux查看库文件路径

但有些时候,库文件名称没有携带版本信息,或者你想获取更详细的元数据。这时候可以用 readelf -d libxxx.so | grep SONAME 来读取库的SONAME字段。SONAME是动态库的接口版本标识,通常格式是 libxxx.so.major.minor。举个例子,执行 readelf -d /usr/lib/x86_64-linux-gnu/libssl.so | grep SONAME,就能看到类似 libssl.so.1.1 的输出。

如果你只想快速知道系统里某个库是否安装以及版本号中标麒麟linux,dpkg -l(Debian系)或者 rpm -qa | grep 库名(RedHat系)会更省事。比如在Ubuntu上输入 dpkg -l | grep libssl,就能列出所有名称包含libssl的包及其版本号。

查看静态库的版本信息

linux查看库文件路径_linux查看库函数_linux查看库版本

静态库(.a文件)不像动态库那样有SONAME机制,它的版本信息通常藏在文件名里。比如 libcrypto.a 可能对应的就是OpenSSL的某个版本。但静态库本质上是一堆.o目标文件的集合,你无法直接通过库文件本身看到版本字符串。

这时候,你可以查看对应的头文件或者开发文档。大多数开源库在安装时会附带头文件,头文件里一般会定义版本宏。例如在 /usr/include/openssl/opensslv.h 中就有 OPENSSL_VERSION_NUMBEROPENSSL_VERSION_TEXT 这两个宏,你可以在代码里引用它们,或者直接用 grep 命令搜索这个头文件:grep OPENSSL_VERSION_TEXT /usr/include/openssl/opensslv.h,输出就像 #define OPENSSL_VERSION_TEXT "OpenSSL 1.1.1w 11 Sep 2023"

如果头文件不在标准路径linux使用教程,试试 find /usr -name "opensslv.h" 找到它。对于自行编译安装的库,头文件往往在 /usr/local/include 下。

linux查看库文件路径_linux查看库函数_linux查看库版本

使用pkg-config快速查找库版本

pkg-config 是Linux开发中一个非常实用的工具。它读取 .pc 文件(通常位于 /usr/lib/pkgconfig/usr/local/lib/pkgconfig),其中包含了库的版本号、编译参数等信息。使用方式很简单:pkg-config --modversion openssl,它会直接输出版本号,比如 1.1.1w

这种方法对开发者特别友好,因为它不需要你去找文件路径。不过前提是这个库提供了 .pc 文件。很多常见的开源库如GLib、GTK、Qt、Libcurl都支持。你可以用 pkg-config --list-all 2>/dev/null | grep ssl 来看系统里有哪些库的 .pc 文件可用。

对于没有提供 .pc 文件的库,pkg-config 就无能为力了。这时你可以退回到前面提到的头文件或动态库的方法。

用ldconfig和ldd检查运行时库版本

当你编译了一个程序,运行时却报错找不到库或者版本不匹配,这时候就需要检查运行时库的加载情况了。ldconfig -p | grep 库名 可以列出系统缓存中所有动态库的完整路径和SONAME。例如 ldconfig -p | grep libssl 会输出类似 libssl.so.1.1 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libssl.so.1.1

linux查看库版本_linux查看库函数_linux查看库文件路径

ldd 命令用于查看一个可执行文件或共享库依赖了哪些动态库及其加载路径。比如 ldd /usr/bin/curl | grep ssl,输出会显示 libssl.so.1.1 => /usr/lib/x86_64-linux-gnu/libssl.so.1.1 这样的信息,能帮你确认程序实际链接的是哪个版本的库。

如果发现链接的库版本不对linux查看库版本,有时候是因为系统里安装了多个版本的库,而链接顺序或 LD_LIBRARY_PATH 环境变量导致加载了旧版本。你可以用 LD_LIBRARY_PATH 临时指定路径来验证,或者通过 ldconfig 更新缓存。

对于还在开发阶段的库,你可以在源码目录下查找 configure 脚本、CMakeLists.txt 或者 Makefile,它们通常会有版本号的定义。有些库的版本号写在与库同名的头文件中,比如 libfoo.h 里可能会有 #define LIBFOO_VERSION "1.2.3"

Tagged:
Author

这篇优质的内容由TA贡献而来

刘遄

《Linux就该这么学》书籍作者,RHCA认证架构师,教育学(计算机专业硕士)。

发表回复