静态库和共享库(动态库)_Linux环境

静态库的生成和使用

静态链接库

一.静态库的生成
ar -rc lib库名.a *.o……

注意:”lib库名.a”叫做库文件名,不同于库名。

二.静态库的使用
1.官方方法:
gcc filename.c -L 指定路径 -l库名
这种方法搜索库的路径是通过 “-L” 选项来指定搜索静态库的路径
gcc filename.c -l库名
这种方法是在系统缺省路径(/lib | /usr/lib)下查找静态库

2.土方法:
gcc filename.c 库文件名
这种方法是源代码中用到了哪个.o文件,编译后的文件就只包含库中的相应代码,而不是包含整个静态库

动态链接库

一.动态库(共享库)的生成
gcc -fPIC -shared -o lib库名.so *.c……

-fPIC:表示编译为位置独立的代码,也就是告诉GCC产生的代码不要包含对函数和变量具体内存位置的引用,这是因为现在还无法知道使用该消息代码的应用程序会将它链接到哪一段内存地址空间。

-shared:表示这是一个共享库

二.动态库(共享库)的使用以及路径设置

设置动态库路径的方法:
方法一(需要root权限)
1>vim /etc/ld.so.conf/*.conf(*是你需要链接的库名)
2>在刚才打开的文件中添加上你需要链接的动态库的路径
3>ldconfig :刷新刚才的配置文件

方法二
将环境变量LD_LIBRARY_PATH设置为当前目录
export LD_LIBRARY_PATH=$(pwd)

方法三
将动态库移动到/usr/lib
mv lib*.so /usr/lib

动态库的使用
gcc filename -L 路径 库名

动态库和静态库的优缺比较

1.静态库的优点

  • 代码装载速度块,执行速度比动态库快

  • 只需要保证在开发者的计算机中由正确的.LIB文件,在以二进制的形式发布程序时,不需要考虑用户的计算机上.LIB文件是否存在以及版本问题,不会存在DLL Hell问题

DLL Hell:应用程序受到动态数据库的拖累,应用程序的某一个组件会被其他应用程序的不兼容组件覆盖,结果导致收到干扰的应用程序完全不能工作

2.动态库的优点

  • 因为动态库只在代码运行的时候载入,并且不向静态库那样将代码和所需要的库绑定在一起,所以更加节省内存并且减少物理页面的换入换出。
  • 在内存中共享一个目标文件模块,也可以增加CPU缓存的命中率。因为不同进程间的数据和指令访问你都集中在了同一个共享模块中。
  • .DLL文件和.EXE文件独立,只要输出接口不变(即名称,参数,返回值的类型,调用约定不变),更换DLL文件不会对EXE文件造成影响。只要第三方按照指定的接口编写符合要求的动态链接文件,程序就可以动态的载入各种由第三方开发的模块,因而极大地提高了可维护性和可扩展性。
  • 加强了程序的兼容性。一方面,一个程序在不同的平台运行时可以动态的链接到由操作系统提供的动态链接库,这些动态链接库相当于在程序和操作系统之间增加了一个中间层,从而消除了程序对不同平台之间依赖的差异性。另一方面,不同的编程语言编写的程序只要按照函数调用约定就可以调用同一个DLL函数。
  • 适用于大规模的软件开发,使得开发过程独立,耦合度小,便于不同开发者/组织进行开发和测试。

3.两者的缺点
静态库:生成的可执行文件体积较大,包含相同的公共代码,造成对内外存空间的极大浪费。
动态库:
①使用动态链接库的应用程序不是自完备的,它依赖的DLL模块也要存在,如果使用载入时动态链接,程序启动时发现DLL文件不存在,系统将终止程序并给出错误信息。而使用运行时动态链接,系统不会终止,但是由于DLL中的导出函数不可用,程序会加载失败。当某个模块更新后,如果新模块和旧模块不兼容,那么那些需要该模块才能运行的软件将统统无法运行
②使用动态库的程序执行速度也比使用静态库要慢,因为它包含一个寻找库的过程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值