Linux下面的静态库,动态库,静态链接,动态链接
Linux下面的静态库,动态库,静态链接,动态链接
(一)几个概念的理解
源程序经过编译后形成一组目标模块,在利用链接程序将这组模块链接,形成装入模块,即可执行文件。但是根据链接程序链接时间的不同,可将链接分为以下三种:
(1)静态链接:在程序运行之前,将各模块以及他们所需要的库函数,链接成一个完整的装入模块,不再分开。静态链接已经将各模块之间的相对地址重新调整,即装入模块就是一个新的模块。
(2)装入时动态链接:这是指用户编译后得到的目标模块,在装入内存时,边装入边链接现在已经被运行时动态链接取代了。
(3)运行时动态链接:这是指对“某些”模块的链接,是在程序执行中需要该模块时,才进行链接。
动态链接是指在生成可执行文件时,只是建立一个函数引用的接口,等到执行时用到该模块时才在内存中寻找,比如错误处理模块,有的时候整个程序运行下来没有出错,则没有必要链接错误处理模块。
动态库又叫共享库,一般以.so结尾。动态库的代码是在运行时才寻找的,因此一般采用动态库开发的程序代码体积较小。静态库则是在链接时已经链接到目标程序,因此代码体积较大,一般以.a结尾。
(二)在Linux下面的用法
(1)生成静态链接库
$gcc -c hello.c -o hello.o
$ar -cqs libhello.a hello.o
其中ar是Linux下面打包的命令,经常被用来生成库文件。另外库文件一般以lib开头。关于ar的具体用法还请大家查看man文档。
(2)生成动态链接库
$gcc -c hello.c -o hello.o
$gcc -shared -o libhello.so test.o
(3)将生成的libhello.a,libhello.so拷贝到/usr/lib或者/lib下
(4)编译带静态链接库的程序
$gcc -c test.c -o test.o //生成目标模块,下面开始链接
$gcc test.o -Bstatic -lhello -o test //hello为静态库名字,不必带lib开头
(5)编译带动态链接库的程序
$gcc -c test.c -o test.o
$gcc test.o -Bdynamic -lhello
编译器默认寻找库的路径在/lib或/usr/lib下,所以我们刚才已经拷贝过了,编译器就可以找到。如果不在这两个目录下面,则根据系统的不同,一般在/etc/ls.so.conf这个文件中修改。