构建linux程序库和使用linux程序库

构建linux程序库和使用linux程序库

ID:14709440

大小:46.50 KB

页数:19页

时间:2018-07-30

构建linux程序库和使用linux程序库_第1页
构建linux程序库和使用linux程序库_第2页
构建linux程序库和使用linux程序库_第3页
构建linux程序库和使用linux程序库_第4页
构建linux程序库和使用linux程序库_第5页
资源描述:

《构建linux程序库和使用linux程序库》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、构建Linux程序库和使用Linux程序库【转载】构建Linux程序库和使用Linux程序库2008-09-1015:59  在本文里,我们将探索与Linux的程序库有关的知识。首先,我们考察静态库的基本知识,并介绍如何使用ar命令来建立静态库。然后,我们将学习共享库方面的知识,并讲述可以动态加载的共享库的有关内容。   一、什么是程序库   通俗的讲,一个程序库就是目标程序文件的一个集合。如果某些目标文件提供了解决一个特定问题的所需功能,我们就可以把这些目标文件归并为一个程序库,从而让应用开发者更易于访问这些目标文件,省得到处去找。   对于静态库,我们可以用实用程序

2、ar来建立。当应用程序开发人员利用程序库进行程序的编译和连接时,程序库中为应用程序所需的那些元件就会集成到最终生成的的可执行程序中。之后,因为程序库已经融入应用程序的映像之中,成为它密不可分的一部分了,所以对应用程序来说,已经没什么外部的程序库可言了。   共享程序库(或者动态程序库)也会连接到一个应用程序的映像上,不过需要两个不同的步骤。第一步发生在构建应用程序之时,链接程序检查是否在应用程序或者程序库内部找到了构建应用程序所需的全部符号(函数名或变量名)。第二步发生在运行时,动态加载器把所需的共享库载入内存,然后动态地把它链接到应用程序的映像之中。注意,这里与静态程

3、序库不同,这次并没有把共享程序库中的所需元件放入应用程序的映像之中。很明显,这样生成的应用程序映像较小,因为共享程序库和应用程序的映像是相互独立的,如下图所示。 图1静态库示意图图2动态库示意图  虽然共享库能够节约内存,但是这是有代价的——必须在运行时解析程序库。很明显,要想弄清需要哪些库,然后寻找这些库并将其载入内存肯定是需要一定时间的。   本文中,我们会建立两个程序库,一个静态库和一个动态库,并以各自的方式应用于程序之中,以此亲身体验两者之间的区别。  二、静态库的创建和使用   相对于动态链接库,静态库要简单一些,它被静态的链接到应用程序的映像之中。这意味着,

4、映像一旦建好,外部程序库的有无对映像的执行将毫无影响,因为所需的部分已经放进程序二进制映像了。   下面我们来演示如何用一组源文件来构造一个程序库。我们建立的程序库是用来封装GNU/Linux的随机函数的,这样我们的库就可以对外提供随机数生成器了。现在看一下我们的程序库为应用程序提供的接口(API),我们将其放在头文件randapi.h中,如下所示: //randapi.h,我们的程序库的接口#ifndef__RAND_API_H#define__RAND_API_HexternvoidinitRand(void);externfloatgetSRand(void);e

5、xternintgetRand(intmax);#endif/*__RAND_API_H*/  我们的应用程序接口由三个函数构成,第一个函数是initrand(),这是一个初始化函数,它的任务是为使用程序库做好必要的准备,在调用所有其他随机函数之前,必须首先调用这个初始化函数。第二个函数getSRand()的作用是随机返回一个浮点数,其值介于0.0到1.0之间。最后一个函数是getRand(x),它返回一个随机整数,其值介于0到(x-1)之间。   在文件initrand.c中,放的是初始化函数initrand()的实现代码,这个函数使用当前时间作为种子值来初始化随机数

6、生成程序。代码如下所示: //initrand.c,初始化函数initrand()的源代码#include#include//initRand()用于初始化随机数生成器voidinitRand(){time_tseed;seed=time(NULL);srand(seed);return;}  文件randapi.c是我们最后一个实现API的文件,它也提供了一个随机数函数,源代码如下所示: //randapi.c,随机数函数的API实现#include//getSRand()返回一个介于0.0~1.0之间的浮点数f

7、loatgetSRand(){floatrandvalue;randvalue=((float)rand()/(float)RAND_MAX);returnrandvalue;}//getRand()返回一个介于0~(max-1)之间的整数intgetRand(intmax){intrandvalue;randvalue=(int)((float)max*rand()/(RAND_MAX+1.0));returnrandvalue;}  这就是我们的API了,注意,initapi.c和randapi.c的函数原型都放在了同一个头文件中,即

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。