gcc生成静态库.a和动态库.so

一、gcc生成静态库和动态库

函数库分为静态库和动态库两种。静态库在被程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。动态库在程序编译时并不会被连接到目标代码中而是在程序运行时才被载入,因此在程序运行时还需要动态库存在。

(一)、hello实例使用库

1、编辑生成程序hello.c、hello.h、main.c文件

在这里插入图片描述
hello.h程序:
在这里插入图片描述
hello.c程序:

在这里插入图片描述
main.c程序:
在这里插入图片描述

2、将hello.c编译成.o文件

使用ls命令查看是否生成hello.o文件
在这里插入图片描述

3、由.o文件创建静态库

静态库文件的命名规范是以lib为前缀,紧接着为静态库名,扩展名为.a。
创建静态库用ar命令。
使用ls命令查看libmyhello.a文件
在这里插入图片描述

4、在程序中使用静态库

方法一:

在这里插入图片描述
对于自定义的静态库,main.c还可以放在-L.和-lmyhello之间,否则myhello没有定义。
-L.:表示连接的库在当前目录

方法二:

在这里插入图片描述

方法三:

在这里插入图片描述
验证静态库特点:
在删掉静态库的情况下,运行可执行文件,发现程序仍旧正常运行,表明静态库跟程序执行没有联系。同时,也表明静态库是在程序编译的时候被连接到代码中的。
在这里插入图片描述

5、由.o文件创建动态库

动态库文件命名规范:以lib作为前缀,扩展名为.so。
gcc -shared -fPIC -o libmyhello.so hello.o
shared:表示指定生成动态链接库,不可省略。
-fPIC:表示编译为位置独立的代码,不可省略。
命令中的-o一定不能够被省略。

在这里插入图片描述

6、在程序中使用动态库

在这里插入图片描述
gcc -o hello main.c -L. -lmyhello或gcc main.c libmyhello.so -o hello
再运行可执行文件hello,会出现错误,此时将将libmyhello.so复制到目录/usr/lib中可解决问题。
在这里插入图片描述

(二)、使用静态库实例

1、创建编辑x2x.h、x2x.c、x2y.h、x2y.c、main.文件

在这里插入图片描述
x2x.h程序:

x2y.h程序:
在这里插入图片描述
x2x.c程序:
在这里插入图片描述
x2y.c程序:
在这里插入图片描述
main.c程序:
在这里插入图片描述

2、将x2x.c、x2y.c文件生成.o文件

使用ls命令查看是否生成x2x.o、x2y.o文件。
在这里插入图片描述

3、由.o文件创建静态库

在这里插入图片描述

4、使用.a文件创建可执行文件并执行

在这里插入图片描述
使用size记录文件大小:
在这里插入图片描述

(三)、使用动态库实例

同(二)中实例文件。

1、由.o文件创建动态库

在这里插入图片描述

2、由.so文件创建可执行文件并执行

在这里插入图片描述
此时出现错误,将libafile.so复制到目录/usr/lib中可解决问题。
在这里插入图片描述
使用size记录文件大小:在这里插入图片描述

二、总结

通过几个程序用gcc生成静态库和动态库的练习过程,基本上能够熟练的生成静态库和动态库。在静态库与动态库的使用中能明显感知两种库的差别。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值