简介 Linux 静态与动态链接库

来源:互联网 发布:探测鬼魂的软件 编辑:程序博客网 时间:2024/05/08 02:27

原文出处:点击打开链接

[初级]
[作者] Wick

    文章选取的例子非常简单,上手容易,只是为了讲述静态与动态链接库的生成和链接过
    程,还有他们之间的区别。以下例子在 gcc 4.1.1 下顺利通过。

文件预览

文件目录树如下,如你所见,非常简单。

libtest/   |-- lt.c   |-- lt.h   `-- test.c


 

代码

#lt.c

/* lt.c   *   */      #include <stdio.h>      void myprint(void)   {     printf("Linux library test!\n");   }   



# lt.h   

/* lt.h   *    */      void myprint(void);



#test.c 

/* test.c   *   */      #include "lt.h"      int main(void)   {     myprint();     return 0;   } 


 

先看静态库

首先做成静态库 liblt.a 。

$ gcc -c lt.c -o lt.o   $ ar cqs liblt.a lt.o   


再者,链接,这里指定了静态库的位置,注意文件顺序不可乱序。

$ gcc test.o liblt.a -o test   


这个时候再来看他的引用库情况。

$ ldd test           linux-gate.so.1 =>  (0xffffe000)           libc.so.6 => /lib/libc.so.6 (0xb7e29000)           /lib/ld-linux.so.2 (0xb7f6e000)


 

动态库

做成动态库 liblt.so 。

$ gcc -c lt.c -o lt.o   $ gcc -shared -Wall -fPIC lt.o -o liblt.so


链接方法I,拷贝到系统库里再链接,让gcc自己查找

$ sudo cp liblt.so /usr/lib   $ gcc -o test test.o -llt   


这里我们可以看到了 -llt 选项,-l[lib_name] 指定库名,他会主动搜索
lib[lib_name].so 。这个搜索的路径可以通过 gcc --print-search-dirs来查找。

链接方法II,手动指定库路径

$ cc -o test test.o -llt -B /path/to/lib 


这里的-B 选项就添加 /path/to/lib 到gcc搜索的路径之中。这样链接没有问题但是方法II
中手动链接好的程序在执行时候仍旧需要指定库路径(链接和执行是分开的)。需要添加系
统变量 LD_LIBRARY_PATH :

$ export LD_LIBRARY_PATH=/path/to/lib   


这个时候再来检测一下test程序的库链接状况(方法I情况)

$ ldd test           linux-gate.so.1 =>  (0xffffe000)           liblt.so => /usr/lib/liblt.so (0xb7f58000)           libc.so.6 => /lib/libc.so.6 (0xb7e28000)           /lib/ld-linux.so.2 (0xb7f6f000)   


恩,是不是比静态链接的程序多了一个 liblt.so ?恩,这就是静态与动态的最大区别,静
态情况下,他把库直接加载到程序里,而在动态链接的时候,他只是保留接口,将动态库与
程序代码独立。这样就可以提高代码的可复用度,和降低程序的耦合度。

原创粉丝点击