加入收藏 | 设为首页 | 会员中心 | 我要投稿 好传媒网 (https://www.haochuanmei.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

linux中的so文件

发布时间:2022-11-16 17:01:26 所属栏目:Linux 来源:网络
导读: 静态链接和动态链接
静态链接:而动态链接在链接的时候并不将那些库文件直接拿过来,而是在运行时,发现用到某些库中的某些函数时,再从这些第三方库中读取自己所需的方法,用到什么功能,加

静态链接和动态链接

静态链接:而动态链接在链接的时候并不将那些库文件直接拿过来,而是在运行时,发现用到某些库中的某些函数时,再从这些第三方库中读取自己所需的方法,用到什么功能,加载什么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/ls
? linux-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 拖库,如果链接器每次都去这些路径遍历一遍,非常耗时,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

————————————————

版权声明:本文为CSDN博主「xz1308579340」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:

(编辑:好传媒网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!