Linux中制作静态库与动态库

库分为静态库和动态库。 二者的不同点在于代码被载入的时刻不同。静态库的代码在编译过程中已经被载入可执行程序,因此体积较大。共享库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小。

库文件

库文件:存放函数的变量的仓库
特点:只能使用库里的函数和变量,不能看到其实现
库文件的存放路径:/lib/usr/lib

静态库与动态库

-后缀-
静态库.a当使用静态库时,库里的函数和变量是在编译时加载到可执行文件的
动态库,so当使用动态库时,库里的函数和变量是在运行时加载到可执行文件的
比较的方面静态库动态库
代码装载速度快-
执行速度快-
使用效率高-
节省内存并减少页面交换-
可维护性和可扩展性高-
开发过程独立,耦合度小-
适用于大规模软件开发-

//己方比较出的优点即为对方缺点

静态库与动态库的制作

静态库制作

  1. gcc -c 源文件
  2. ar rcs 库文件名字 ,目标文件
  3. gcc 源文件 -l库名 -L库的路径

动态库制作

  1. gcc -shared -fPLC 源文件 -o 库名
  2. gcc 源文件 ./库名 -o 可执行文件

示例

测试代码

main.c:

#include"stdio.h"
#include"main.h"
int main()
{
    int a,b;
    scanf("%d%d",&a,&b);
    printf("%d+%d=%d\n",a,b,add(a,b));
    printf("%d-%d=%d\n",a,b,sub(a,b));
    printf("%d*%d=%d\n",a,b,mul(a,b));
    if(b==0)
    printf("div error\n");
    else
    printf("%d/%d=%d\n",a,b,div(a,b));
    return 0;
}

main.h:

extern int add(int,int);
extern int sub(int,int);
extern int mul(int,int);
extern int div(int,int);

cal.c

cal.c
#include"stdio.h"
#include"main.h"
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;
}

静态库制作测试

测试开始前

在这里插入图片描述

步骤1.

gcc -c cal.c//将代码文件编译成目标文件.o

效果:
在这里插入图片描述

步骤2.

ar rcs libcal.a cal.o//通过ar工具将目标文件打包成.a静态库文件

效果:
在这里插入图片描述

步骤3.

gcc main.c -L. -lcal -o main//生成可执行文件

效果:
在这里插入图片描述
试一下可执行文件的运行:
在这里插入图片描述


动态库制作测试

测试开始前

在这里插入图片描述

步骤1.

gcc cal.c -shared -fPIC -o libcal.so//把.c文件编译成.o文件,再把.o文件编译生成libcal.so文件

在这里插入图片描述

步骤2.

gcc main.c ./libcal.so -o main //编译命令

在这里插入图片描述
测试一下运行:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值