静态链接和动态链接

静态链接:而动态链接在链接的时候并不将那些库文件直接拿过来,而是在运行时,发现用到某些库中的某些函数时,再从这些第三方库中读取自己所需的方法,用到什么功能,加载什么so文件,不同操作系统的动态链接库文件格式稍有不同,Linux称之为共享目标文件(Shared Object),文件后缀为.so,Windows的动态链接库(Dynamic Link Library)文件后缀为.dll。

静态链接:在链接的时候,就把所依赖的第三方库函数都打包到了一起,导致最终的可执行文件非常大。

静态链接的存放位置

在Linux上,动态链接库有默认的部署位置,很多重要的库放在了系统的/lib和/usr/lib两个路径下。一些常用的Linux命令非常依赖/lib和/usr/lib64下面的各个库,比如:scp、rm、cp、mv等Linux下常用的命令非常依赖/lib和/usr/lib64下的各个库。不小心删除了这些路径,可能导致系统的很多命令和工具都无法继续使用。

# on Ubuntu 16.04 x86_64
$ ldd /bin/lslinux-vdso.so.1 =>  (0x00007ffcd3dd9000)libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f4547151000)libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f4546d87000)libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f4546b17000)libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f4546913000)/lib64/ld-linux-x86-64.so.2 (0x00007f4547373000)libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f45466f6000)

可以看到,我们经常使用的ls命令依赖了不少库,包括了C语言标准库libc.so。

如果某个Linux的程序报错提示缺少某个库,可以用ldd命令可以用来检查这个程序依赖了哪些库,是否能在磁盘某个路径下找到.so文件。如果找不到,需要使用环境变量LD_LIBRARY_PATH来调整,下文将介绍环境变量LD_LIBRARY_PATH。

SONAME文件命名规则

so文件后面往往跟着很多数字,这表示了不同的版本。so文件命名规则被称为SONAME:

动态链接库查找过程

Linux的动态链接库绝大多数都在/lib和/usr/lib下,操作系统也会默认去这两个路径下搜索动态链接库
这些位置的动态链接库很多,如果链接器每次都去这些路径遍历一遍,非常耗时,Linux提供了ldconfig工具,这个工具会对这些路径的动态链接库按照SONAME规则创建软连接,同时也会生成一个缓存Cache到/etc/ld.so.cache文件里,链接器根据缓存可以更快地查找到各个.so文件。每次在/lib和/usr/lib这些路径下安装了新的库,或者更改了/etc/ld.so.conf文件,都需要调用ldconfig命令来做一次更新,重新生成软连接和Cache。但是/etc/ld.so.conf文件和ldconfig命令最好使用root账户操作。非root用户可以在某个路径下安装库文件,并将这个路径添加到/etc/ld.so.conf文件下,再由root用户调用一下ldconfig。

对于非root用户,另一种方法是使用LD_LIBRARY_PATH环境变量。LD_LIBRARY_PATH存放着若干路径。链接器会去这些路径下查找库。非root可以将某个库安装在了一个非root权限的路径下,再将其添加到环境变量中。

动态链接库的查找先后顺序为:
LD_LIBRARY_PATH环境变量中的路径
/etc/ld.so.cache缓存文件
/usr/lib和/lib
比如,我们把CUDA安装到/opt下面,我们可以使用下面的命令将CUDA添加到环境变量里。
export LD_LIBRARY_PATH=/opt/cuda/cuda-toolkit/lib64:$LD_LIBRARY_PATH

GCC编译选项

-L 去哪个路径下找
-l 找哪个库
编译myfile.c 需要去/path/to/library找name这个包
$ gcc -L/path/to/library -lname myfile.c

linux中的so文件相关推荐

  1. 如何快速清空 Linux 中的大文件

    本文总结了几种快速清空Linux中的大文件方法,快来看看对你有帮助吗? 1. 通过重定向到null清空文件内容 使用 shell 重定向null(不存在的对象)到文件的最简单方法来清空文件内容 # & ...

  2. Linux中常用头文件的作用--转

    http://blog.sina.com.cn/s/blog_5c93b2ab0100q62k.html 1. Linux中一些头文件的作用: <assert.h>:ANSI C.提供断言 ...

  3. Linux中查看日志文件的正确姿势,求你别tail走天下了!

    作为一个后端开发工程师,在Linux中查看查看文件内容是基本操作了.尤其是通常要分析日志文件排查问题,那么我们应该如何正确打开日志文件呢?对于我这种小菜鸡来说,第一反应就是 cat,tail,vi(或 ...

  4. Linux中一切皆文件

    Linux中一切皆文件 1. Linux中所有内容都是以文件的形式保存和管理,即:一切皆文件. 普通文件是文件. 目录(在win下称为文件夹)是文件. 硬件设备(键盘.硬盘.打印机)是文件. 套接字( ...

  5. linux中/etc/passwd文件与/etc/shadow文件解析

    1. /etc/passwd文件 1.1 /etc/passwd文件内容格式 用户名: 密码 : uid  : gid :用户描述:主目录:登陆shell 举个例子: #cat /etc/passwd ...

  6. 如何在 Linux 中挂载 ISO 文件

    在 Windows 中,我们常常使用 Daemon Tools 和 Virtual CloneDrive 等虚拟光驱软件挂载光盘镜像,下面我们一起来学习在 Linux 中如何挂载 ISO 文件. 在 ...

  7. linux在目录前加前缀,linux中批量添加文件前缀的操作方法

    需要在文件夹内所有txt文件的文件名前面添加"gt_"; 就是由原来的文件"xxx.txt"变成"gt_xxx.txt": 网上搜来的脚本如 ...

  8. 本机修改虚拟机linux中的代码文件

    最近在研究swoole这个框架,好不容易装了一个swoole,为了开发方面,需要早宿主机和虚拟机之间文件共享,一开始使用vmware tool可以实现共享,但是只能在linux中看到win共享的文件, ...

  9. linux inittab文件在哪,Linux 中/etc/inittab文件的字段及其说明(转)

    Linux 中/etc/inittab文件的字段及其说明(转)[@more@]/etc/inittab文件中每个登记项的结构都是一样的,共分为以冒号":"分隔的4个字段.具体如下: ...

  10. linux mysql命令行导入_在linux中导入sql文件的方法分享(使用命令行转移mysql数据库)...

    因导出sql文件 在你原来的网站服务商处利用phpmyadmin导出数据库为sql文件,这个步骤大家都会,不赘述. 上传sql文件 前面说过了,我们没有在云主机上安装ftp,怎么上传呢? 打开ftp客 ...

最新文章

  1. svn 分支主干相互合并
  2. 计算机二级python选择题知识点,全国计算机等级考试二级Python练习题库-选择题部分.pdf...
  3. P6282 [USACO20OPEN] Cereal S 思维
  4. C语言及程序设计进阶例程-17 认识链表
  5. 玩转SpringBoot 2.x 之搭建 Actuator 和 SpringBoot Admin监控篇
  6. 下个月计划【2009-5】
  7. Scala 基础 —— String(StringOps)、tuple、Range
  8. 安卓Service完全解析(上)
  9. java byte转十六进制_Python 十六进制hexbytesstr之间的转换和Bcc码的生成
  10. 第十篇:复制对象时切记复制每一个成分
  11. B站 汇编语言 视频 教程
  12. 深蓝-视觉slam-第三节习题
  13. Oracle数据库表空间数据文件最大容量以及存满时处理方法
  14. 手把手教你写一篇价值十万的软文
  15. DNS服务器解析问题
  16. 36氪专访融云CEO董晗:8年企服,6年出海,现计划成为「沙特最大科技企业」
  17. 计算机显卡显示图片原理,认识显卡!浅析显卡及显卡工作原理
  18. filecoin lotus 图形化测试平台pond
  19. Java会说情话的女朋友
  20. DataGrip连接MongoDB

热门文章

  1. 在线端口检测 - 端口扫描 - 端口开放检查
  2. Spring Cloud Data Flow简介
  3. compoundbutton(compoundbutton是什么意思)
  4. linux 怎么关闭输入法快捷键设置方法,关闭输入法快捷键
  5. 明翰英语教学系列之雅思听力篇V0.2(持续更新)
  6. 163邮箱服务器连接错误 请重试,163邮箱无法连接服务器
  7. Axure 8.1.0.3388授权码
  8. TCP/IP基础知识--华为数通部门讲解
  9. 网络编程 : 基于UDP的网络群聊聊天室
  10. IT人员应该掌握的30种技能