静态库与动态库的制作

关于所谓“程序库”:包含了一些通用的函数的数据和二进制可执行机器码的文件。 

静态库:一些目标代码的集合。以.a作为目标文件的扩展名。用ar创建一个静态库。

下面我们开始创建静态库。我们先建立一个static_lib.c的文件,内容包含:

int add(int a,int b)
{
return a+b;
}
int sub(int a,int b)
{
return a-b;
}
int mul(int a,int b)
{
return a*b;
}
int div(int a,int b)
{
return a/b;
}

通过gcc -c static_lib.c 生成一个目标文件。静态库的创建方法如下:

ar rcs 静态库名 目标文件1 目标文件2....目标文件n

ar是工具,而ar工具的参数rcs分别代表什么呢?

r:把列表中的目标文件加到静态库中。

c:若指定的静态库不存在,则创建该库文件。

s:更新静态库,使包含新加入的文件内容。

命令:ar rcs libstatic_lib.a static_lib.o,通过ls命令可以看到多了一个.a的静态文件。

下面我们开始使用。

先建立一个static_lib.h的文件,内容如下。

extern int add(int a,int b);
extern int sub(int a,int b);
extern int mul(int a,int b);
extern int div(int a,int b);
在写一个main.c的主程序。

#include <stdio.h>
#include "static_lib.h"
int main(int argc, char *argv[])
{
int a,b;
printf("input a and b\n");
scanf("%d %d",&a,&b);
printf("add :%d\n",add(a,b));
printf("sub %d\n",sub(a,b));
printf("mul %d\n",mul(a,b));
printf("div %d\n",div(a,b));
return 0;
}

完成以上后,我们开始来编译。通过pwd得到当前路径。

gcc -L/“当前路径”  main.c -lstatic_lib -o 可执行文件名

命令中:-l用来指定静态库,-L用来指定库文件的搜索路径 它们后直接带参数不能跟空格。

再来介绍另一种。

gcc -L. main.c -lstatic_lib -o 可执行文件名

". "表示在当前目录下搜索需要的静态库文件。

遮掩我们便完成了,最后我们执行文件即可。


我们再来说说动态库。动态库的后缀为.so。

动态库优点还是比较多的。易于程序模块的更新,在执行特定程序时,可以覆盖整个库,便于程序的发布。

其实两者方法差不多,只是命令不同。

同样我们先来建立一个auto_lib.c文件,内容与上面相同。现在创建动态库输入下面命令:

gcc -shared -fPIC -o atuo_lib.so tuao_lib.c

-fPIC:用于生成位置无关的代码。

-shared:将位置无关的代码制作成动态库。

先建立一个auto_lib.h的文件,内容如下。

extern int add(int a,int b);
extern int sub(int a,int b);
extern int mul(int a,int b);
extern int div(int a,int b);
在写一个main1.c的主程序。

#include <stdio.h>
#include "static_lib.h"
int main(int argc, char *argv[])
{
int a,b;
printf("input a and b\n");
scanf("%d %d",&a,&b);
printf("add :%d\n",add(a,b));
printf("sub %d\n",sub(a,b));
return 0;
}

使用动态库创建一下程序:

gcc main1.c ./auto_lib.so -o main1

运行程序:

./main1

我们创建了一个动态库,是不是多个程序可以使用了呢?

答案是肯定的。

在写一个main2.c的主程序。

#include <stdio.h>
#include "static_lib.h"
int main(int argc, char *argv[])
{
int a,b;
printf("input a and b\n");
scanf("%d %d",&a,&b);
printf("mul %d\n",mul(a,b));
printf("div %d\n",div(a,b));
return 0;
}

使用动态库创建一下程序:

gcc main2.c ./auto_lib.so -o main2

运行程序:

./main2

以上便是我要简单介绍的静态库与动态库,若有不足之处,还请指出。






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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值