文档章节

各种库相关的解释

01010101010101010101
 01010101010101010101
发布于 2014/01/03 21:16
字数 1289
阅读 23
收藏 1
点赞 0
评论 0


1 什么叫程序库
2 什么是lib,什么是dll,什么是.a,什么是so,什么是静态库,什么是动态库
3 补充说明
4 作者
 


什么叫程序库
所谓程序库,一般是软件作者为了发布方便、替换方便或二次开发目的,而发布的一组可以单独与应用程序进行compile time或runtime链接的二进制可重定位目标码文件。通俗一点说,所谓一个库,就是一个文件,这个文件可以在编译时由编译器直接链接到可执行程序中,也可以在运行时由操作系统的runtime enviroment根据需要动态加载到内存中。一组库,就形成了一个发布包,当然,具体发布多少个库,完全由库提供商自己决定。

什么是lib,什么是dll,什么是.a,什么是so,什么是静态库,什么是动态库
所谓静态库,就是在静态编译时由编译器到指定目录寻找并且进行链接,一旦链接完成,最终的可执行程序中就包含了该库文件中的所有有用信息,包括代码段、数据段等。所谓动态库,就是在应用程序运行时,由操作系统根据应用程序的请求,动态到指定目录下寻找并装载入内存中,同时需要进行地址重定向。 win32平台下,静态库通常后缀为.lib,动态库为.dll linux平台下,静态库通常后缀为.a,动态库为.so 从本质上来说,由同一段程序编译出来的静态库和动态库,在功能上是没有区别的。不同之处仅仅在于其名字上,也就是“静态”和“动态”。由上面的介绍不难看出,相对于动态库,静态库的优点在于直接被链接进可执行程序中,之后,该可执行程序就不再依赖于运行环境的设置了(当然仍然会依赖于 CPU指令集和操作系统支持的可执行文件格式等硬性限制)。而动态库的优点在于,用户甚至可以在程序运行时随时替换该动态库,这就构成了动态插件系统的基础。具体使用静态库和动态库,由程序员根据需要自己决定。

补充说明
另外,需要说明的一点是,从底层实现上,动态库的效率可能会比静态库稍差一点点,注意,这里用了“可能”二字,具体差不差,还得看写程序的人。之所以可能会差,主要原因在于,程序总无法直接调用动态库中的函数符号,而只能通过调用操作系统的runtime enviroment接口来动态载入某个函数符号,同时获得该函数符号在内存中的地址,将其保存为函数指针进行调用,这就在函数调用时增加了一次间接寻址的过程。

还是那句话,希望大家都能深入opencv源码库中去,不要仅仅满足于会调几个API,这样很难对自己有提高的。深入进去读源码,看看人家是怎么组织软件架构的,怎么划分模块的。实际上,如果任何一个软件体系的层次模块划分足够清晰和灵活的话,移植性就不会成为很大的问题,无非就是字节对齐、部分算法利用特殊指令集进行优化之类的,这些改动应该仅限于局部调整,而不用全盘重写的。软件架构,很重要的一条就是open-close 原则,要清楚哪些是可变的哪些是不可变的。就像上面,将来会发生变化的算法,就可以考虑放到动态库中,以免将来程序统一全部升级。

另外,在移植软件的过程中,保持接口不变是有多重含义的,我们通常知道的是:

函数、变量名称不变
函数、变量语法属性不变(比如一个声明为C形式的函数,必须以C形式对其进行调用,否则由于重载特性会找不到函数名)
函数返回值类型不变
函数参数个数不变
函数参数类型不变
这里,常常被人们遗忘的,也是最重要的一点是:

保持函数语义不变

这是什么意思,对于一段程序,除了词法分析、语法推导之外,还有很重要的一条就是语义分析。简单来说,对于一个函数,必须保持移植前后,该函数的返回值含义不变、参数含义不变、函数内部行为的外部表现不变。忽视其中任意一条,都会造成上层应用程序的行为变为未定义,从而移植失败。

作者
bingpo @ OpenCV 

© 著作权归作者所有

共有 人打赏支持
01010101010101010101
粉丝 23
博文 90
码字总数 68915
作品 0
长宁
高级程序员
CacheManager:–个通用缓存接口抽象类库

CacheManager是–个缓存通用接口抽象类库,它支持各种高速缓存提供者,例如Memcache,Redis,并且有许多先进的功能特性。具体可以访问官方网站 http://cachemanager.net。 CacheManager设计目标就...

李朝强
2016/01/08
115
0
Python简介

1.1 Python的历史 1.1.1 Python的诞生 Python是一门高级计算机程序设计语言,1989年,荷兰的Guido von Rossum创造了它。Guido是是一个牛人,1982年,他从阿姆斯特丹大学获得了数学和计算机硕...

勇敢的石头
2017/11/17
0
0
python urllib爬取网页编码问题

利用python urllib库爬取网页,有时获得的网页打印或写文件遇到编码问题,找了许久终于知道为什么了。 首先利用urlopen()函数获取网页对象,再利用info()函数打印网页的相关信息,确定网页的...

fjie
2016/04/28
0
0
22 个免费的图表、流程图工具

饼图、柱状图、线图和许多其他的图形是非常重要的用来表示数据和沟通的信息,并可展示两个实体之间的关系。而这些图形如果用在 Web 上则有助于吸引访客的注意力,并有效地解释相关数据。 在这...

oschina
2012/05/14
48.1K
27
生物信息学基础库--BioJava

BioJava – 开源的生物信息学基础库 生物信息学,从字面上理解,这是一门与生命科学和信息科学这两个当今热点领域都相关的学科。 那到底什么是生物信息学?在这里,我只能很遗憾地告诉大家,...

匿名
2009/06/19
2.1K
0
简单爬虫(urllib+BeautifulSoup)

爬虫是怎么实现的? 简单介绍 爬虫:一段自动抓取互联网信息的程序 从一个url出发,然后访问和这个url相关的各种url,并提取相关的价值数据。 URL:Uniform Resource Location的缩写,译为“...

廖少少
2017/10/31
0
0
我的速查手册

本文只是记录一些自己经常翻查的手册(帮助文档),有些是解释语法的(例如make, python),有些是介绍工具使用的(例如git),写下来是为了自己方便查找。 希望对你也有帮助。 我能下载到的...

u013553529
2017/12/30
0
0
程序员解决问题的 60 个策略

程序员的生活就是解决一个又一个问题,永无止境。这篇文章介绍了一系列解决问题的策略。 根本的指导方针 1. 首先写代码的时候最好不要有缺陷。最好的修复方法就是让 bug 胎死腹中。 良好的单...

oschina
2015/02/02
11.9K
32
一步步带你编译ijkplayer so支持HTTPS

当项目中使用ijkplayer,而且还需要播放HTTPS链接的视频时,就比较蛋疼了 ( ̄. ̄),ijkplayer默认不支持HTTPS播放,但提供了编译OpenSSL的选项,可以自己编译so文件支持HTTPS播放。这篇文章的...

haoyuan6786
06/07
0
0
Lush手册——第一章 简介

简介 本章将展示Lush及其能力与特性。 1.1 Lush展示 Lush是一门面向对象的编程语言,是为对大规模数值运算与图形化应用感兴趣的研究人员、实验人员和工程师设计的。Lush用于以下场景,即想要...

烟波
2015/10/09
159
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

垃圾回收算法

一 如何判断对象可以回收 1 引用计数法 思路大概为:给对象添加一个引用计数器,每当有一个地方引用它时,计数器值加1;当引用失效时,计数器减1;任何时刻计算器为0的对象就是不可能再被使用...

sen_ye
2分钟前
0
0
Activiti简介(学习总结一)

一、介绍 activiti是使用命令模式设计基于bpmn2.0的一款开源工作流引擎。 工作流简单举例:提交请假申请->经理审批->结束。这就是一个简单流程。activiti支持用户自定义流程。配置各个流程对...

沙shasha
3分钟前
0
0
VCL界面控件DevExpress VCL Controls发布v18.1.3|附下载

DevExpress VCL Controls是 Devexpress公司旗下最老牌的用户界面套包。所包含的控件有:数据录入,图表,数据分析,导航,布局,网格,日程管理,样式,打印和工作流等,让您快速开发出完美、...

Miss_Hello_World
4分钟前
0
0
加米谷大数据培训:云计算、大数据和人工智能之间的关系

一般谈云计算的时候会提到大数据、谈人工智能的时候会提大数据、谈人工智能的时候会提云计算……感觉三者之间相辅相成又不可分割。 一、云计算最初的目标 云计算最初的目标是对资源的管理,管...

加米谷大数据
9分钟前
1
0
java集合元素的默认大小

当底层实现涉及到扩容时,容器或重新分配一段更大的连续内存(如果是离散分配则不需要重新分配,离散分配都是插入新元素时动态分配内存),要将容器原来的数据全部复制到新的内存上,这无疑使...

竹叶青出于蓝
11分钟前
1
0
Java快速开发平台,JEECG 3.7.7闪电版本发布,增加多套主流UI代码生成器模板

JEECG 3.7.7 闪电版本发布,提供5套主流UI代码生成器模板 导读 ⊙平台性能优化,速度闪电般提升 ⊙提供5套新的主流UI代码生成器模板(Bootstrap表单+BootstrapTable列表\ ElementUI列表表单)...

Jeecg
14分钟前
0
0
export 和 module.export 的区别

在浏览器端 js 里面,为了解决各模块变量冲突等问题,往往借助于 js 的闭包把左右模块相关的代码都包装在一个匿名函数里。而 Nodejs 编写模块相当的自由,开发者只需要关注 require,exports,...

孟飞阳
17分钟前
1
0
技术教育的兴起

技术教育的兴起 作者: 阮一峰 1、 有一年,我在台湾环岛旅行。 花莲的海边,我遇到一对台湾青年夫妻,带着女儿在海滩上玩。我们聊了起来。 当时,我还在高校当老师。他们问我,是否觉得台湾...

吕伯文
17分钟前
0
0
Linux服务器下的HTTP抓包分析

说到抓包分析,最简单的办法莫过于在客户端直接安装一个Wireshark或者Fiddler了,但是有时候由于客户端开发人员(可能是第三方)知识欠缺或者其它一些原因,无法顺利的在客户端进行抓包分析,...

mylxsw
21分钟前
0
0
mybatis3-javaapi

sqlSessionFactoryBuilder->sqlSessionFactory->sqlSession<-rowbound<-resultHandler myBatis uses a Java enumeration wrapper for transaction isolation levels, called TransactionIsol......

writeademo
24分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部