设为首页 收藏本站
查看: 384|回复: 0

[经验分享] 简介 Linux 静态与动态链接库

[复制链接]

尚未签到

发表于 2016-2-6 18:49:34 | 显示全部楼层 |阅读模式
[初级]
[作者] 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 ?恩,这就是静态与动态的最大区别,静
态情况下,他把库直接加载到程序里,而在动态链接的时候,他只是保留接口,将动态库与
程序代码独立。这样就可以提高代码的可复用度,和降低程序的耦合度。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-174615-1-1.html 上篇帖子: (七)linux搭建网络环境和putty客户端 下篇帖子: 用php作Linux自动执行脚本
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

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