7点微信公众号:请点这里。7点测试网QQ总群:277957570。

7点测试网

 找回密码
 注册7点

QQ登录

只需一步,快速开始

查看: 411|回复: 1

Linux 动态链接库和静态库示例

[复制链接]
发表于 2016-3-26 01:16:38 | 显示全部楼层 |阅读模式
文件预览

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

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


代码
#lt.c
  1. /* lt.c
  2. *
  3. */  
  4.   
  5. #include <stdio.h>  
  6.   
  7. void myprint(void)  
  8. {  
  9.   printf("Linux library test!\n");  
  10. }  
复制代码

# lt.h

  1. /* lt.h
  2. *  
  3. */  
  4.   
  5. void myprint(void);  
复制代码

#test.c
  1. /* test.c
  2. *
  3. */  
  4.   
  5. #include "lt.h"  
  6.   
  7. int main(void)  
  8. {  
  9.   myprint();  
  10.   return 0;  
  11. }  
复制代码

先看静态库
首先做成静态库 liblt.a 。

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

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

$ gcc test.c liblt.a -o test  

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

$ ldd test                                            //ldd  是用来查看链接那些动态链接库
        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 ?恩,这就是静态与动态的最大区别,静态情况下,他把库直接加载到程序里,而在动态链接的时候,他只是保留接口,将动态库与程序代码独立。这样就可以提高代码的可复用度,和降低程序的耦合度。
您需要登录后才可以回帖 登录 | 注册7点

本版积分规则

QQ|Archiver|手机版|小黑屋|7点测试网 ( 京ICP备09084002号

GMT+8, 2018-10-20 14:59 , Processed in 0.241890 second(s), 25 queries .

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表