简谈链接库

 

 

链接库包括动态链接库和静态链接库,其中动态链接库又称为共享库。静态链接库文件以.a, .lib为后缀;而动态链接库以.so, .dll为后缀。关于链接库,简单来说有以下几个方面要涉及到:

1 链接库的概念?

链接库本质上都是目标文件的集合,在编译链接过程中作为输入。

静态链接库,链接过程中从链接库中找到程序中所使用到的函数或者变量的定义,将其“拷贝”到所编译的程序中,被"拷贝"的这部分(注意是部分,而不一定是全部)代码在物理上就成为可执行程序的一部分;使用静态库编译的程序可以离线独立执行,但是生成的可执行文件较大。

动态链接库,在编译链接时需要提供显示指定动态链接库的路径,编译器会在其中查找当前编译的程序文本中没有的函数或者变量的定义,找到这些定义即可,并不像使用静态库那样进行定义的“拷贝”,找不到相关定义则报链接错;此外,动态链接库在可执行程序启动时还需动态加载,因此,链接动态库的可执行程序不能单独执行,必须提供动态链接库的路径。动态链接库可被多个程序共享,因此也称之为共享库。

值得注意的是,链接库中如果有定义和当前编译的程序文本的定义重复时,会被忽略,编译器默认使用程序中的定义,但并不会报告重定义错误;这点与直接使用.o文件进行编译是不一样的。

 

 

2 为什么要使用链接库?

a.实现代码共享

b.提高程序执行效率

c.代码模块化

d.安全性上的考虑

 

3 动态链接和静态链接的区别?

a.动态链接:真正意义上的代码共享,多个模块可以使用同一个动态链接库

   静态链接:实际上是代码拷贝,并不是真正的共享

b.动态链接:存储压力小

  静态链接:做拷贝,占用较多内存

c.动态链接:动态装载较慢,运行时载入造成延迟。

  静态链接:代码在静态装载,没有运行时延迟

d.动态链接:容易升级维护,在接口发生变化时,直接替换动态库即可

  静态链接:静态库需要重新编译

e.动态链接:动态链接库需要发布,使得程序的可移植性较之使用静态链接库的程序要差

 

 

4 如何使用链接库?

 

以gcc为例:

可以直接在命令行指定生成动态链接库,如:gcc -fPIC -shared -o libxxx.so *.c。fPIC指定生成位置无关代码(因为动态链接库在动态加载),PIC亦即Position Independent Code(位置无关代码)。

从目标文件生成静态链接库,如: ar crv -o libxxx.a *.o。

 

使用链接库文件,最好在环境变量LD_LIBRARY_PATH中加入库文件的路径,或者也可以直接在命令行通过-L选项指定,如:

gcc -o exe -L ~/path -lxxx。 xxx即libxxx.a(so)

 

未完待续 ... ...

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章