静态函数库 和 动态函数库

Linux应用程序设计中需要的外部函数主要由函数库系统调用来提供。

函数库按照链接方式可分为静态链接库动态链接库两种方式。

下图是两种链接方式的特点

Linux应用程序使用的主要函数库均存放于/lib, /usr/lib目录下,其中采用 * .so.* 方式命名的是动态函数库,而以 *.a 方式命令的是静态函数库。

静态函数库

程序所要用到的库函数代码在链接时全部被复制到每个程序中。
导致的问题:如果有多个进程在内存中同时运行,并且使用了相同的库函数,那么就会有多份拷贝,这就是对空间的浪费。

注意:
1. Linux下进行链接时, 默认是链接动态库
2. 如果需要使用静态库,需要使用 编译选项-static
例: gcc -static test.c -o test

制作静态库:
1. gcc –c mylib.c –o mylib.o(只编译不连接)
2. ar cqs libmylib.a mylib.o
3. 将制作好的libmylib.a 复制到/usr/lib目录下

注意:
在链接时,若要使用静态库,则需要增加编译选项
-lname:GCC在链接时,默认只会链接C函数库,而对于其他的函数库,则需要使用 -l 选项来显示地指明需要的链接库。
例:gcc test.c –lmylib -o test

动态函数库

程序所要用到的库函数代码在链接不会全部被复制到每个程序中,只是复制一次,每个程序共同分享函数库。

制作动态库:
1. gcc –c mylib.c –o mylib.o
2. gcc -shared -fPIC mylib.o -o libmylib.so
3. 将制作好的libmylib.so 复制到/usr/lib
-fpic 使输出的对象模块是按照可重定位地址方式生成的。
-shared 指明产生动态链接库。

注意:
使用动态函数库同样需要使用 -l 编译选项。
例:gcc test.c –lmylib -o test

使用 readelf -d test 可以查看程序使用的函数库。

其他注意事项:
红帽企业版6默认不提供libc.a静态函数库,需要安装:
rpm -ivh glibc-static-2.12………….i686.rpm

静态生成的程序比动态的大。

静态链接库和动态链接库的比较

1、静态链接库的优点:
(1) 代码装载速度快,执行速度略比动态链接库快
(2) 只需保证在开发者的计算机中有正确的.LIB文件,在以二进制形式发布程序时不需考虑在用户的计算机上.LIB文件是否存在及版本问题,可避免DLL地狱等问题。

2、动态链接库的优点:
(1) 更加节省内存并减少页面交换
(2) DLL文件与EXE文件独立,只要输出接口不变(即名称、参数、返回值类型和调用约定不变),更换DLL文件不会对EXE文件造成任何影响,因而极大地提高了可维护性和可扩展性
(3) 不同编程语言编写的程序只要按照函数调用约定就可以调用同一个DLL函数;

3、两者各自的不足之处:
(1) 使用静态链接生成的可执行文件体积较大,包含相同的公共代码,造成浪费;
(2) 使用动态链接库的应用程序不是自完备的,它依赖的DLL模块也要存在,如果使用载入时动态链接,程序启动时发现DLL不存在,系统将终止程序并给出错误信息。而使用运行时动态链接,系统不会终止,但由于DLL中的导出函数不可用,程序会加载失败;速度比静态链接慢。当某个模块更新后,如果新模块与旧的模块不兼容,则程序就无法正常运行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值