gcc编译静态库和动态库的区别

GCC静态库编译和动态库编译的区别

1.创建静态库

1.1 环境准备及代码展示

环境:windows11系统下的wls2 linux子系统
代码:
sub.c

#include<stdio.h>
int x2x(int x,int y){
int sum;
sum=x+y;
return sum;
}

sub.h

#ifndef SUB_H
#define SUB_H
int x2x(int x,inty);
#endif//SUB_H

main.c

#include<stdio.h>
#include<sub.h>
int main(){
int x=3,y=4;
printf("%d\n",x2x(x,y);
return 0;
}

使用nano或vim等编辑工具编辑创造上述代码

1.2使用ar和gcc工具创建静态库并编译运行

gcc创建.o文件

gcc -c sub.c

在这里插入图片描述
接下来通过ar工具创建.a的静态库文件
静态库文件的命名规范:以lib为前缀,.a为拓展名的文件
我们通过ar工具创建一个名称为libsub.a的静态库

ar -crv libsub.a sub.o

在这里插入图片描述
显示创建成功
接下来链接静态库生成可执行文件,运行可执行文件

gcc main.c libsub.a -o sub
./sub

在这里插入图片描述
查看可执行文件sub的大小

size sub

在这里插入图片描述
静态库编译是直接链接到程序中,程序运行时将不再需要静态库,我们将静态库删掉运行程序来验证一下

rm libsub.a
./sub

在这里插入图片描述

可以看到我们执行了rm命令之后(注意rm删除的文件不可恢复,谨慎使用),文件中没有了静态库libsub.a,但sub程序依旧可以得出结果,说明在编译链接时,静态库直接链接到程序之中,程序在运行时不需要再访问静态库。

2.创建动态库进行gcc编译

动态库在gcc编译时,不会直接被链接到程序中,只有在程序运行时,才会访问动态库调用其中的函数运行。
创建动态库我们使用gcc工具创建,动态库的命名规则和静态库差不多,都是以lib为前缀,但静态库拓展名为.a 动态库的拓展名为.so
我们使用以下命令来创建libsub.so动态库

gcc -shared -fPIC -o libsub.so sub.o

在这里插入图片描述
使用ls命令查看文件,我们看到动态库libsub.so创建成功
接下来我们将libsub.so复制到/usr/lib文件夹下,如过不进行这一步,在我们链接动态库进行编译时,gcc会报以下错误
在这里插入图片描述
这是因为程序在运行时需要到/usr/lib中寻找动态库文件,若找到,则载入,没有找到,报错
我们使用以下命令将libsub.so复制到/usr/lib目录下在进行编译

mv libsub.so /usr/lib

接下来我们再编译运行就ok了
在这里插入图片描述
我们使用size命令查看动态库文件的大小
在这里插入图片描述
接下来我们将动态库删除再运行程序
在这里插入图片描述
我们可以看到删除了动态库之后程序不再正常运行

3.动态库和静态库编译的区别

通过使用size命令我们看到,使用静态库生成的可执行程序比使用动态库生成的可执行文件大小要大,而原因我们可以再删除动态库和删除静态库之后的程序运行测试中看到,静态库是再编译程序时,直接链接,动态库是在程序运行时再访问链接。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值