库文件及静态库和动态库

1、什么是库文件?
库:预先编译好的方法的集合。
库分为静态库和动态库。
(1)静态库:libxx.a 库里用到的方法包含在可执行程序中
(2)共享库:libxx.so 库里用到的方法只做标记,运行时才加载
无论动态库或者静态库都是从.o文件生成的,因此在讲解动态库和静态库之前,我们先执行以下命令生成 hello.o 文件和 test.o 文件:
gcc -c hello.c
gcc -c test.c
静态库的制作命令:
①通过gcc编译生成.o文件(无论静态库还是动态库都是由.o文件生成的)
②使用ar命令创建静态库,ar命令将很多.o文件转换成.a文件
命令:ar rcs lib****.a ***.o
动态库的制作命令:
我们从.o文件开始,首先需要创建一个名为myhello的动态库,则动态库文件名就是libmyhelli.so
gcc -shared -fPIC -o libmyhello.so hello.o
“PIC”命令行标记告诉gcc产生的代码不要包含对函数和变量具体内存位置的引用,这是因为现在还无法知道使用该消息代码的应用程序会将它连接到哪一段内存地址空间。这样编译出的 hello.o 可以被用于建立共享链接库。建立共享链接库只需要gcc的“-shared”标记即可。
调用动态库编译并链接文件,生成可执行程序hello:
gcc -o hello test.c -L. -lmyhello
“-lmyhello”标记告诉gcc驱动程序在链接阶段引用共享库 libmyhello.so
“-L.”标记告诉gcc函数库可能位于当前目录。否则GNU连接器会查找标准系统函数目录,它会先后搜索以下路径:1. elf文件的 DT_RPATH段; 2. 环境变量LD_LIBRARY_PATH; 3. /etc/ld.so.cache文件列表; 4. /lib/,/usr/lib/ 目录,找到库文件后将其载入内存。
./hello出错(我们需要将 libmyhello.so 复制到 /usr/lib/下,当再次执行 hello 时便可执行成功(需要管理员用户))
静态库与动态库的区别:
(1)静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。
(2)动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。
1 静态链接库的优点
(1) 代码装载速度快,执行速度略比动态链接库快;
(2) 只需保证在开发者的计算机中有正确的.LIB文件,在以二进制形式发布程序时不需考虑在用户的计算机上.LIB文件是否存在及版本问题,可避免DLL地狱等问题。
2 动态链接库的优点
(1) 更加节省内存并减少页面交换;
(2) DLL文件与EXE文件独立,只要输出接口不变(即名称、参数、返回值类型和调用约定不变),更换DLL文件不会对EXE文件造成任何影响,因而极大地提高了可维护性和可扩展性;
(3) 不同编程语言编写的程序只要按照函数调用约定就可以调用同一个DLL函数;
(4)适用于大规模的软件开发,使开发过程独立、耦合度小,便于不同开发者和开发组织之间进行开发和测试。
3 不足之处
(1) 使用静态链接生成的可执行文件体积较大,包含相同的公共代码,造成浪费;
(2) 使用动态链接库的应用程序不是自完备的,它依赖的DLL模块也要存在,如果使用载入时动态链接,程序启动时发现DLL不存在,系统将终止程序并给出错误信息。而使用运行时动态链接,系统不会终止,但由于DLL中的导出函数不可用,程序会加载失败;速度比静态链接慢。当某个模块更新后,如果新模块与旧的模块不兼容,那么那些需要该模块才能运行的软件,统统撕掉。这在早期Windows中很常见。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值