出自Linux Wiki

提示:此文已超过 10 年(3685 天)未更新,如发现内容过时或有误,欢迎改进:)

Linux中的.so文件类似于Windows中的DLL,是动态链接库,也有人译作共享库(因so的全称为Shared Object)。当多个程序使用同一个动态链接库时,既能节约可执行文件的大小,也能减少运行时的内存占用。

对于用户而言,经常遇到的问题是某些应用程序找不到其需要的.so文件:

error while loading shared libraries: ...: cannot open shared object file: No such file or directory

本文将主要围绕该问题展开,介绍so文件存放位置、版本命名方案等。欢迎补充其它信息。

存放位置

Linux中绝大多数.so文件都存放在/lib、/usr/lib/(见Linux目录结构),对于64位和32位共存的系统,32位的动态库可能会放在/lib32、/usr/lib32,完整的动态库存放路径列表可通过/etc/ld.so.conf文件配置。(如果修改了配置,需要用 /sbin/ldconfig 命令更新缓存)

应注意动态库搜寻路径并不包括当前文件夹,所以当即使可执行文件和其所需的so文件在同一文件夹,也会出现找不到so的问题,如

./chrome: error while loading shared libraries: libnss3.so.1d: cannot open shared object file: No such file or directory

此时可用LD_LIBRARY_PATH环境变量做临时设置,如:

LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH ./chrome

也有些so文件是在程序执行时临时加载的(如插件),它们的路径就比较灵活,只要可执行文件能找到它就行了。

程序链接的动态库

一个可执行文件链接了哪些动态库呢?在遇到“error while loading shared libraries”时,我们难免会对此产生好奇。

查看该信息的方法是通过ldd,如

$ ldd chrome

linux-vdso.so.1 => (0x00007fff52dff000)

libX11.so.6 => /usr/lib/libX11.so.6 (0x00007f0caebe4000)

libdl.so.2 => /lib/libdl.so.2 (0x00007f0cae9e0000)

libXrender.so.1 => /usr/lib/libXrender.so.1 (0x00007f0cae7d6000)

libXss.so.1 => /usr/lib/libXss.so.1 (0x00007f0cae5d3000)

libXext.so.6 => /usr/lib/libXext.so.6 (0x00007f0cae3c1000)

librt.so.1 => /lib/librt.so.1 (0x00007f0cae1b9000)

....(略)

要想看系统还没找到的动态库,可以借用grep:

$ldd chrome | grep 'not found'

libnss3.so.1d => not found

libnssutil3.so.1d => not found

libsmime3.so.1d => not found

libplc4.so.0d => not found

libnspr4.so.0d => not found

版本

动态库的版本总是个问题,如果编译时链接的库和执行时提供的不一样,难免会导致程序的执行发生诡异的错误。为解决此问题,Linux系列的做法是这样的:

首先,每个so文件有一个文件名,如libABC.so.x.y.z,这里ABC是库名称,x.y.z是文件的版本号,一般来说:

第一位x表示了兼容性,x不一样的so文件是不能兼容的。

第二位y的变化表示可能引入了新的特性(Feature),但总的来讲还是兼容的。

第三位z的变化一般表示仅是修正了Bug。

并非所有.so文件都遵循此规则,但其应用确实很普遍。

在系统中,会存在一些符号链接, 如

libpam.so -> libpam.so.0.83.0

libpam.so.0 -> libpam.so.0.83.0

其中第一个主要在使用该库开发其它程序时使用,比如gcc想连接PAM库,直接连libpam.so就行了,不必在链接时给出它的具体版本。第二个则主要用在运行时,因为前面说了第一位版本一样的库是互相兼容的,所以程序运行时只要试图连接libpam.so.0就够了,不必在意其具体的版本。ldconfig可以自动生成这些链接。

那么编译程序时gcc在链接一个so文件(如libpam.so)时,如何知道该程序运行时链接哪个文件呢(上例中是libpam.so.0)?原来产生so文件时,可以指定一个soname,一般形如libABC.so.x。libpam.so.0。回头看一下上节ldd的结果,可以印证这一现象。

有时还会看到形如libABCn.so,即版本号出现在.so前面的库文件,如libXaw6.so。此类文件一般是为开发者着想,比如GTK+ 3已经推出,但很多开发者还是想用GTK+ 2开发软件。由于编译时只连接无版本号的.so文件,就只有把版本号放在.so前面了。

参考资料

本文对您有帮助?分享给更多朋友!

反馈与讨论

发现文档不全面、有错误却没时间编辑文档?想分享自己的经验或见解?欢迎在此留言、讨论。

linux .so库文件,动态库(.so)相关推荐

  1. 库文件(动态库和静态库)

    1.库文件 通常,我们会在头文件中对类以及函数进行声明,在.cpp源文件中完成具体的实现. 但是这个.cpp文件是对所有人可见的,不具备安全性.保密性,而C/C++提供了一个方法,将这个.cpp源文件 ...

  2. linux系统下的“静态库和动态库”专题之二:库的创建和使用

    接上文[linux系统下的"静态库和动态库"专题之一:库的概念和规则]所述,我们通常把一些公用函数制作成函数库,供其它程序使用.函数库分为静态库和动态库两种. – 静态库在程序编译 ...

  3. Linux 静态库和动态库的生成及使用

    1.分文件编程 分模块的编程思想:假设一个项目需要用到网络.超声波.电机,程序不是都杂糅在同一个文件,而是将网络.超声波.电机需要调用的函数写在不同文件里,在主文件中直接调用即可. 好处: a.功能责 ...

  4. 树莓派开发2-静态库,动态库,wiringpi库

    文章目录 库 库的制作 库的使用 wiringpi库 树莓派学习笔记,本文图片文字皆为转述 库 a)静态库 静态函数库,是在程序执行前(编译)就加入到目标程序中去了 : 优点: 运行快发布程序无需提供 ...

  5. linux 中如何将文件粘贴到usr下的lib内,学会在Linux下GCC生成和使用静态库和动态库...

    一.基本概念1.1什么是库 在windows平台和linux平台下都大量存在着库. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的平台不同(主 ...

  6. linux分文件编程、静态库与动态库

    参考:linux静态库与动态库编程 作者:丶PURSUING 发布时间:2021-02-02 16:51:49 网址:https://blog.csdn.net/weixin_44742824/art ...

  7. 【C语言】标准库(头文件、静态库、动态库),windows与Linux平台下的常用C语言标准库

    一.Introduction 1.1 C语言标准库 1.2 历代C语言标准 1.3 主流C语言编译器 二.C语言标准库 2.1 常用标准头文件 2.2 常用标准静态库 三.windows平台 四.Li ...

  8. linux静态库添加文件,Linux静态库和动态库的编写和使用

    Linux静态库和动态库的编写和使用 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. 1  静态库和动态库的区别 1.1. 静态函数库 (1)静态函数库的名 ...

  9. Linux系统上库文件的生成与使用(静态库和动态库)

    目录 1.什么是库文件? 2.静态库的生成与使用 2.1.生成 .o 文件 2.2.创建静态库 2.3.使用静态库 3.动态(共享)库的生成与使用 3.1.生成 .o 文件 3.2.生成动态库文件 3 ...

最新文章

  1. 为什么淘宝、天猫和旺信的 App 不整合成一个?
  2. .NET Core 3.0 Preview 6中对ASP.NET Core和Blazor的更新
  3. 通过Java代码装配bean
  4. dojo 的DOM操作 dojo/dom
  5. 前端学习(904):同步任务和异步任务执行区别
  6. ecshop 模板 php代码,ecshop不能在模板文件.dwt和.lbi中直接添加php代码的解决方法...
  7. 读懂这篇文章,你的阿里技术面就可以过关了 | Apache RocketMQ 101
  8. 云际阔,总相连——Let's Connect!
  9. 对某产品政策性文件的解读
  10. CR(code review)常见问题
  11. LeetCode:每日一题(2020.4.9)
  12. windows上搭建NFS服务器--haneWIN
  13. KYLO的Java基础知识总结(其二)
  14. javascript中 String对象方法(大小写转换、连接与拆分)
  15. 全向轮机器人运动学分析
  16. 学习 spring-cloud-aibaba第七篇,JWT认证授权
  17. SpringBoot项目配置SSL证书微信小程序jar包
  18. WXGA TFT和XGA TFT的区别
  19. Source Insight 使用
  20. 用rankn()等概率生成1~m的通用方法

热门文章

  1. excel 两组数据交点_适用于安卓,苹果手机的Excel程序
  2. 宽网多媒体发布系统产品简介
  3. 天龙源码框架分析_天龙源码分析 - 客户端 包
  4. Linux的scan命令,clamscan-Linux查毒工具的命令详解
  5. 剑走偏锋--使用WMI获取远程计算机进程程序集中查毒病毒打造内网安全环境
  6. 金昌气象APP隐私政策
  7. 使用redis中的zset进行金牌、银牌、铜牌的排序操作
  8. nuscenes数据集关于毫米波雷达的操作
  9. 音视频探索(2):AAC编码解析
  10. Jenkins开发之——SCM日程表配置