您的位置:首页 > 运维架构 > Linux

Linux应用程序学习之制作静态函数库

2015-06-03 12:21 447 查看
Linux应用程序学习之静态函数库设计
Linux应用程序中需要的外部函数主要是由函数库和系统调用来提供,函数库和系统调用的区别在于函数库位于用户态,而系统调用是由linux内核来实现,也就是实现代码位于内核中,例如我们常用的打开文件函数open,本节主要就是介绍位于用户态的函数库。

函数库按照连接方式分为静态链接库和动态链接库,我们linux系统的应用程序使用的主要函数库均存放于根目录下的/lib和/usr/lib目录下,采用*.so.*结尾的是动态链接库,采用*.a结尾的则是静态链接库。有关动态链接库和静态链接库的区别大家应该很清楚,每个应用程序调用静态链接库时都会在内存中有一份静态函数库的拷贝,而对于动态链接库来讲,如果内存中有一份动态函数库存在,它就不会再拷贝一份了,因此相比静态链接库,使用动态链接库更加的节约空间。

那么在linux进行编译时,默认使用的是哪种链接库内?我们打开linux操作系统,写一个hello.c程序如图下:



然后在linux系统下进行编译,之后通过

Readelf –d filename
命令来查看我们所使用的链接库类型,下图就是我查看的结果



该图第三行显示了我们所使用的链接库类型,是以*.so.*结尾的,所以使用的是动态链接库,因此在我们的linux系统应用程序中,默认使用的是动态链接库,那如果想使用静态链接库,该怎么办,只需在编译的时候加上一个-static即可,但是在编译的时候我们却出现了如下的结果



这个错误是说我们不能找到我们的静态C库,也就是找不到libc.a(我们的linux函数库都是要在名字前面加一个lib头的),主要原因是红帽企业版6的liunx系统默认没用提供这个静态函数库,因此需要我们自己安装,采用rpm命令就可以进行安装了。

下面就进入我们最重要的部分,自己制作静态函数库。自己制作函数库,主要完成两个步骤:

(1)编写一个.c文件,然后进行编译产生我们的.o文件。

(2)打包我们的.o文件为.a文件,也就是我们的静态库文件。

举个例子,如果我们有一个hello.o文件,可通过下面的命令来进行打包

ar cqs libhello.a hello.o

需要说明的是,libhello.a就是我们的函数库名,我们必须在前面加一个lib,这是我们的linux下的函数库命名规则,然后在后面添加我们的文件名即组成我们的函数库名。这之后就制作好了我们的静态函数库,然后将其复制到我们的/usr/lib目录下就可以使用了。

下面我们就来用实例完成我们linux系统下静态函数库的设计,首先我们新建一个caluate.c文件,然后写一个简单的程序,之后进行我们的第一步编译文件:



经过差错修改之后就产生了我们的.o文件了,我的是caluate.o

然后就是打包了,通过我们的ar cqs libcaluate.a caluate.o命令来产生我们的静态函数库文件即libcaluate.a文件。

最后将其移至/usr/lib中,这样我们的静态函数库就做好了。

下面就是编写一个小程序来调用我制作的静态函数库来验证是否可行了,

这里我写一个test.c文件,如下



同时我们还必须写一个.h文件来包含我们的函数库,如下为我们的caluate.h文件内容



最后就是编译我们的test.c文件了,如图所示



这个就是编译我们的文件然后执行文件后的结果了,我们发现我们制作的静态函数库成功运行了起来。需要说明的是我们的编译选项–lcaluate,linux系统下默认的静态库为C库,如果要指定其他的静态函数库就必须添加这个选项,其构成为l+filename,如图说明,这个需要我们注意了。



好了,以上就是我学习linux下自己制作静态函数库的知识了,希望能得到大家的指正。

补充:

前面我们说了linux中静态函数库的设计,那么我们也自然而言想到动态函数库该如何设计?有了上面的设计基础,我们的动态函数库设计就相对简单了,说白了就是一些命令选项的使用了

(1)利用 gcc -c caluate.c -o caluate.o 命令产生我们的.o文件

(2)利用 gcc -shared -fPIC caluate.o -o libcaluate.so 命令来产生我们的动态链接文件,也就是.so文件

(3)将产生的.so文件移到/usr/lib目录下即可完成动态链接库的设计

接下来就可以按照我们检验静态库的方式来进行检验了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: