【Linux】使用gcc生成静态库和动态库

1.什么是静态库和动态库?


首先,库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。在Linux下分为两种,静态库和共享库(动态库)。对比两者的区别如下:

库的种类描述优点缺点
静态库目标文件的简单集合,Linux下以.a作为后缀,程序编译时载入程序所需库被加载后不会发生跨平台不兼容等类似的问题由于所需的代码被加载到程序中,故体积大,占内存
动态库程序运行时载入,Linux下以.so作为后缀体积小,不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例依赖于库,跨平台可能会存在不兼容的问题

2.使用gcc生成静态库和动态库


2.1 gcc生成静态库

我们现在分别有hello.h,hello.c,test.c三个文件。关系:test.c调用hello()函数,它定义在hello.c内,声明在hello.h内。
第一步:使用gcc -c hello.c 生成hello.o文件。
这里写图片描述
第二步:使用ar crv libhello.a hello.o 由hello.o生成静态库文件libhello.a。静态库文件的命名规范:lib+文件名.a。所以我们生成的静态库文件也必须遵循这个规范。
这里写图片描述
第三步:使用gcc -o test test.c libhello.a 生成可执行文件test。最后一个参数 libhello.a指明了生成目标程序要用到的静态库名。gcc将会从静态库中将公用函数连接到目标文件中。
这里写图片描述
最后,我们验证一下静态库的特点,删除静态库libhello.a,再次运行可执行程序test。
这里写图片描述
删除静态库后程序依然正常运行,说明静态库在程序编译时被加载到程序后成为程序的一部分,就算删除了库,对程序也没有影响。

2.2 gcc生成动态库

第一步:依赖hello.c生成hello.o。与静态库生成第一步相同。
第二步:通过gcc -shared -fPCI -o libhello.so hello.o命令生成动态库文件。动态库文件命名方式是lib+文件名.so。
这里写图片描述
第三步:gcc -o test test.c libhello.so 生成可执行文件test。但是会发现生成的可执行文件test运行出错,如下:
这里写图片描述
出现这样的原因是,程序在运行时,会在/usr/lib和/lib等目录中查找需要的动态库文件。若找到,则载入动态库,否则将提示错误信息而终止程序。所以,我们需要将生成的动态库移动到/usr/lib目录下程序即可正常运行。
这里写图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值