Linux动态库和静态库比较
发布日期:2021-06-30 19:10:18
浏览次数:3
分类:技术文章
本文共 1774 字,大约阅读时间需要 5 分钟。
Linux动态库和静态库比较文件预览
文件目录树如下,如你所见,非常简单。 1. libtest/ 2. |-- lt.c 3. |-- lt.h 4. `-- test.c #lt.c 1. 4. 5. #include 6. 7. void myprint(void) 8. { 9. printf("Linux library test!/n"); 10. } # lt.h 1. 4. 5. void myprint(void); #test.c 1. 4. 5. #include "lt.h" 6. 7. int main(void) 8. { 9. myprint(); 10. return 0; 11. } 先看静态库 首先做成静态库 liblt.a 。 1. $ gcc -o lt.o -c lt.c 2. $ ar cqs liblt.a lt.o 再者,链接, 1. $ gcc test.o liblt.a -o test 这个时候再来看他的引用库情况。 1. $ ldd test 2. linux-gate.so.1 => (0xffffe000) 3. libc.so.6 => /lib/libc.so.6 (0xb7e29000) 4. /lib/ld-linux.so.2 (0xb7f6e000) 动态库 做成动态库 liblt.so 。 1. $ gcc -o lt.o -c lt.c 2. $ gcc -shared -Wall -fPIC -o liblt.so lt.o -shared 该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接。相当于一个可执行文件 -fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。-L.:表示要连接的库在当前目录中 -ltest:编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名称 LD_LIBRARY_PATH:这个环境变量指示动态连接器可以装载动态库的路径。 链接方法I,拷贝到系统库里再链接,让gcc自己查找 1. $ sudo cp liblt.so /usr/lib 2. $ gcc -o test test.o -llt 这里我们可以看到了 -llt 选项,-l[lib_name] 指定库名,他会主动搜索 lib[lib_name].so。这个搜索的路径可以通过 gcc --print-search-dirs来查找。 链接方法II,手动指定库路径 1. $ cc -o test test.o -llt -B /path/to/lib 这里的-B 选项就添加 /path/to/lib 到gcc搜索的路径之中。这样链接没有问题但是方法II中手动链接好的程序在执行时候仍旧需要指定库路径(链接和执行是分开的)。需要添加系统变量 LD_LIBRARY_PATH : 1. $ export LD_LIBRARY_PATH=/path/to/lib 这个时候再来检测一下test程序的库链接状况(方法I情况) 1. $ ldd test 2. linux-gate.so.1 => (0xffffe000) 3. liblt.so => /usr/lib/liblt.so (0xb7f58000) 4. libc.so.6 => /lib/libc.so.6 (0xb7e28000) 5. /lib/ld-linux.so.2 (0xb7f6f000) 恩,是不是比静态链接的程序多了一个 liblt.so ?恩,这就是静态与动态的最大区别,静态情况下,他把库直接加载到程序里,而在动态链接的时候,他只是保留接口,将动态库与程序代码独立。这样就可以提高代码的可复用度,和降低程序的耦合度。另外,运行时,要保证主程序能找到动态库,所以动态库一般发布到系统目录中,要么就在跟主程序相对很固定的路径里,这样不管主程序在本机何时何地跑,都能找得到动态库。而静态库只作用于链接时,运行主程序时,静态库文件没存在意义了。
转载地址:https://linuxstyle.blog.csdn.net/article/details/1539717 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
第一次来,支持一个
[***.219.124.196]2024年04月23日 22时33分40秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
区块链+人工智能,新经济的DNA
2019-04-30
2018年2月份GitHub上最热门的Python项目:深度学习占半壁江山
2019-04-30
学会这10种机器学习算法你才算入门
2019-04-30
15 个有意思的 JavaScript 和 CSS 库推荐! 你用过几个?
2019-04-30
技术分享 | mongo 集群连接数暴涨处理案例一则
2019-04-30
技术分享 | MySQL 会受到“Unix千年虫“的影响吗
2019-04-30
第30期:索引设计(全文索引中文处理)
2019-04-30
第40问:对进行中的 DDL 进行 kill , 到底多久能响应
2019-04-30
第41问:组提交是怎样提高性能的
2019-04-30
彻底讲懂Spring singletonBean循环依赖与三级缓存
2019-04-30
CSDN文章复制
2019-04-30
【强烈推荐】Java设计模式:怒肝代理模式,可真把我榨干了!
2019-04-30
双十一最完整记录!阿里、京东全部都有
2019-04-30
为什么说,随波逐流是成为一个数据科学英雄最大的阻碍
2019-04-30
如何度过人生艰难:魔都28岁硬核知识型美少女自救指南
2019-04-30
淘宝总裁蒋凡:今年双11淘宝推荐流量超过了搜索流量
2019-04-30
为什么一些创立才2、3年的创新公司,不赚钱却可以赴美上市?
2019-04-30
互联网大佬都是怎么找对象的?
2019-04-30
大数据之下无隐私
2019-04-30
黄仁勋:英伟达豪赌GPU终获回报,但我更看好高性能计算
2019-04-30