linux下静态库和动态库的区别
来源:互联网 发布:赌神2016网络电影 编辑:程序博客网 时间:2024/06/08 15:35
一、引言
我们通常把一些公用函数制作成函数库,供其它程序使用。
函数库分为静态库和动态库两种。
通常情况下,对函数库的链接是放在编译时期(compile time)完成的。所有相关的对象文件(object file)与牵涉到的函数库(library)被链接合成一个可执行文件(executable file)。程序在运行时,与函数库再无瓜葛,因为所有需要的函数已拷贝到相应目录下下。所以这些函数库被成为静态库(static libaray),通常文件名为“libxxx.a”的形式。
其实,我们也可以把对一些库函数的链接载入推迟到程序运行的时期(runtime)。这就是动态链接库(dynamic link library)技术。
二、两者区别:
a,静态库的使用需要:
1 包含一个对应的头文件告知编译器lib文件里面的具体内容
2 设置lib文件允许编译器去查找已经编译好的二进制代码
b,动态库的使用:
程序运行时需要加载动态库,对动态库有依赖性,需要手动加入动态库
c,依赖性:
静态链接表示静态性,在编译链接之后, lib库中需要的资源已经在可执行程序中了, 也就是静态存在,没有依赖性了
动态,就是实时性,在运行的时候载入需要的资源,那么必须在运行的时候提供 需要的 动态库,有依赖性, 运行时候没有找到库就不能运行了
d,区别:
简单讲,静态库就是直接将需要的代码连接进可执行程序;动态库就是在需要调用其中的函数时,根据函数映射表找到该函数然后调入堆栈执行。
做成静态库可执行文件本身比较大,但不必附带动态库
做成动态库可执行文件本身比较小,但需要附带动态库
链接静态库,编译的可执行文件比较大,当然可以用strip命令精简一下(如:strip libtest.a),但还是要比链接动态库的可执行文件大。程序运行时间速度稍微快一点。
静态库是程序运行的时候已经调入内存,不管有没有调用,都会在内存里头。静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。
其在编译程序时若链接,程序运行时会在系统指定的路径下搜索,然后导入内存,程序一般执行时间稍微长一点,但编译的可执行文件比较小;动态库是程序运行的时候需要调用的时候才装入内存,不需要的时候是不会装入内存的。
动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。
三、动态链接库的特点与优势
首先让我们来看一下,把库函数推迟到程序运行时期载入的好处:
1. 可以实现进程之间的资源共享。
什么概念呢?就是说,某个程序的在运行中要调用某个动态链接库函数的时候,操作系统首先会查看所有正在运行的程序,看在内存里是否已有此库函数的拷贝了。如果有,则让其共享那一个拷贝;只有没有才链接载入。这样的模式虽然会带来一些“动态链接”额外的开销,却大大的节省了系统的内存资源。C的标准库就是动态链接库,也就是说系统中所有运行的程序共享着同一个C标准库的代码段。
2. 将一些程序升级变得简单。用户只需要升级动态链接库,而无需重新编译链接其他原有的代码就可以完成整个程序的升级。Windows 就是一个很好的例子。
3. 甚至可以真正坐到链接载入完全由程序员在程序代码中控制。
程序员在编写程序的时候,可以明确的指明什么时候或者什么情况下,链接载入哪个动态链接库函数。你可以有一个相当大的软件,但每次运行的时候,由于不同的操作需求,只有一小部分程序被载入内存。所有的函数本着“有需求才调入”的原则,于是大大节省了系统资源。比如现在的软件通常都能打开若干种不同类型的文件,这些读写操作通常都用动态链接库来实现。在一次运行当中,一般只有一种类型的文件将会被打开。所以直到程序知道文件的类型以后再载入相应的读写函数,而不是一开始就将所有的读写函数都载入,然后才发觉在整个程序中根本没有用到它们。
静态库:在编译的时候加载生成目标文件,在运行时不用加载库,在运行时对库没有依赖性。
动态库:在目标文件运行时加载,手动加载,且对库有依赖性。
具体在开发中用到哪种库,我觉得还是根据实际的内存大小,ROM大小,运行的速度等综合考虑。
0
上一篇:ptrace的些许总结
下一篇:printf实现
相关热门文章
- test123
- 编写安全代码——小心有符号数...
- 使用openssl api进行加密解密...
- 一段自己打印自己的c程序...
- 彻底搞定C语言指针详解-完整版...
给主人留下些什么吧!~~
评论热议
阅读全文
0 0
- 静态库和动态库的区别(linux下)
- linux下静态库和动态库的区别
- linux下静态库和动态库的区别
- linux 动态静态库和动态库的区别
- linux下动态链接库和静态链接库的使用和区别
- linux下的静态库与动态库的区别
- linux下的静态库与动态库的区别
- Linux下静态链接和动态链接库的区别和创建
- Linux 下 C/C++ 静态库、动态库的区别
- Linux下动态库(.so)和静态库(.a) 的区别(略有增删减)
- Linux下动态库(.so)和静态库(.a) 的区别
- Linux下动态库(.so)和静态库(.a) 的区别(略有增删减)
- Linux下静态、动态库(隐式、显式调用)的创建和使用及区别
- linux windows静态库和动态库的区别
- [转载]linux 静态库和动态库的区别 (
- linux静态库和动态库的区别
- linux中静态库和动态库的区别
- linux 动态库和静态库的区别、制作、使用
- 动态顺序表
- C++基础(五)虚函数、重载、覆盖、隐藏
- ip分片+端口
- Linux进程管理(1):进程描述和进程创建
- ptrace的些许总结
- linux下静态库和动态库的区别
- 使用智能指针的注意事项
- 开源框架合集
- LINUX C中用define定义可变参数的宏
- copy_to_user和copy_from_user两个函数的分析
- pt_regs结构
- Linux VFS中write系统调用实现原理
- php过滤特殊字符
- wait_event_interruptible_out的返回值
原创粉丝点击
热门IT博客
热门问题
老师的惩罚
人脸识别
我在镇武司摸鱼那些年
重生之率土为王
我在大康的咸鱼生活
盘龙之生命进化
天生仙种
凡人之先天五行
春回大明朝
姑娘不必设防,我是瞎子
艳姆1到6集全集在线11k
1r玫玫资k源站365更新入口
悦达起亚k5
k20测评
起亚k2报价及图片
东风k2
起亚k2价格
起亚k2油耗
k2车多少钱
悦达起亚k2三厢
k2论坛
悦达k2
东风k2悦达起亚
k2报价
现代酷派标志
起亚k2论坛
现代雅绅特图片
起k2报价及图片
现代朗行
k2价格
起亚k2自动挡
现代领翔图片
东风悦达k2
悦达起亚k2两厢
起亚2
起亚新k2
起亚k2改装
k2是什么车
起亚k2三厢怎么样
悦达起亚k2报价及图片
k2报价及图片
起亚k2改装图片
k2两厢报价及图片
k2车怎么样
k2多少钱
起亚k2图片
起亚k2吧
k2汽车
起亚k2两厢报价及图片
k2起亚
瑞达起亚k2