background image

linux 下的静态库与动态库的区别

1.什么是库
在 windows 平台和 linux 平台下都大量存在着库。

本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。

由于 windows 和 linux 的本质不同,因此二者库的二进制是不兼容的。
2.库的种类
linux 下的库有两种:静态库和共享库(动态库)。
二者的不同点在于代码被载入的时刻不同。

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

3.库存在的意义
库是别人写好的现有的,成熟的,可以复用的代码,你可以使用但要记得遵守许可协议。
现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库
的存在意义非同寻常。
共享库的好处是,不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共
享库的实例。
4.库文件是如何产生的在 linux 下

静态库的后缀是.a,它的产生分两步
Step 1.由源文件编译生成一堆.o,每个.o 里都包含这个编译单元的符号表
Step 2.ar 命令将很多.o 转换成.a,成文静态库
动态库的后缀是.so,它由 gcc 加特定参数编译产生。

例如:
$ gcc -fPIC -c *.c $ gcc -shared -Wl,-soname, libfoo.so.1 -o libfoo.so.1.0 *.
5.库文件是如何命名的,有没有什么规范
在 linux 下,库文件一般放在/usr/lib /lib 下,

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

6.如何知道一个可执行程序依赖哪些库
ldd 命令可以查看一个可执行程序依赖的共享库,
例如# ldd /bin/lnlibc.so.6
=> /lib/libc.so.6 (0×40021000)/lib/ld-linux.so.2
=> /lib/ld- linux.so.2 (0×40000000)
可以看到 ln 命令依赖于 libc 库和 ld-linux 库

Gdb 调试段错误
1.段错误是什么

 

段错误是指访问的内存超出了系统给这个程序所设定的内存空间,例如访问了不存在的
内存地址、访问了系统保护的内存地址、访问了只读的内存地址等等情况。