linux下的静态库动态库,Linux下的静态库和动态库

66b52468c121889b900d4956032f1009.png

8种机械键盘轴体对比

本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?

linux下的库:

linux下的库有两种:静态库和共享库(动态库)。

二者的不同点在于代码被载入的时刻不同。

静态库的代码在编译过程中已经被载入可执行进程,因此体积较大。

共享库的代码是在可执行进程运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小。

库的产生:

静态库的后缀是.a,它的产生分两步:

1.由源文档编译生成一堆.o,每个.o里都包含这个编译单元的符号表。

2.ar命令将很多.o转换成.a,成为静态库。

动态库的后缀是.so,它由gcc加特定参数编译产生。

具体例程:gcc进程编译的静态链接和动态链接

库的位置:

在linux下,库文档一般放在/usr/lib和/lib下,

静态库的名字一般为libxxxx.a,其中xxxx是该lib的名称

动态库的名字一般为libxxxx.so.major.minor,xxxx是该lib的名称,major是主版本号, minor是副版本号。

查看可执行进程依赖的库:

ldd命令可以查看一个可执行进程依赖的共享库,

例如:1

2

3

4

5[email protected]:~/mypro/C$ ldd main

linux-vdso.so.1 (0x00007ffe5e7b9000)

libhelloworld.so => /home/mrbluyee/mypro/C/libhelloworld.so (0x00007fd38e2ac000)

libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fd38debb000)

/lib64/ld-linux-x86-64.so.2 (0x00007fd38e6b0000)

静态库链接时搜索路径顺序:

a.ld会去找GCC命令中的参数-L

b.再找gcc的环境变量LIBRARY_PATH

(LIBRARY_PATH环境变量:指定进程静态链接库文档搜索路径)

c.再找内定目录 /lib /usr/lib /usr/local/lib

动态链接时、执行时搜索路径顺序:

a.编译目标代码时指定的动态库搜索路径;

b.环境变量LD_LIBRARY_PATH指定的动态库搜索路径;

(LD_LIBRARY_PATH环境变量:指定进程动态链接库文档搜索路径)

c.配置文档/etc/ld.so.conf中指定的动态库搜索路径;

d.默认的动态库搜索路径/lib;

e.默认的动态库搜索路径/usr/lib。

可执行进程在执行的时候定位库文档:

当系统加载可执行代码时候,能够知道其所依赖的库的名字,但是还需要知道绝对路径。

此时就需要系统动态载入器(dynamic linker/loader)。

对于elf格式的可执行进程,是由ld-linux.so*来完成的,它先后搜索:

a.elf文档的 DT_RPATH段

b.环境变量LD_LIBRARY_PATH

c./etc/ld.so.cache文档列表

d./lib/,/usr/lib目录

找到库文档后将其载入内存。

当出现:error while loading shared libraries: libxxx.so: cannot open shared object file: No such file or directory 的错误时,对应的3种解决方案在这里有例程描述:

gcc进程编译的静态链接和动态链接

同样,下面的方法是一样的:

想要系统能够找到新安装的库的方法:

a.如果安装在/lib或者/usr/lib下,那么ld默认能够找到,无需其他操作。

b.如果安装在其他目录,需要将其添加到/etc/ld.so.cache文档中,步骤如下:

—1.编辑/etc/ld.so.conf文档,加入库文档所在目录的路径

—2.运行ldconfig 目录名字,该命令会重建/etc/ld.so.cache文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值