静态库和动态库

静态库

静态库的命名方式:“libxxx.a”,其中“xxx”为库名,库名前加“lib”,后缀用“.a”

工作过程 :
编译过程中,静态库的所有数据都被载进目标文件里。程序运行的时候就不再需要静态库

优点 :
编译后的执行程序不需要外部函数库支持

缺点 :
1.静态函数库编译成的文件占用的内存比较大。

2.当静态库改变时,程序必须重新编译

静态库的生成与使用

命令介绍

静态库的生成和使用过程中需要用到ar命令。

ar是Linux系统的一个备份压缩命令,用于创建、修改备存文件(archive),或从备存文件中提取成员文件。ar命令最常见的用法是将目标文件(.o文件)打包为静态链接库。ar命令带的参数不同,功能也不同,其参数如下:

-c:创建一个库,不管这个库存不存在,都将创建。

-r:在库中插入模块(替换)。若插入的模块在库中存在,则会进行替换。

-s:创建目标文件索引,在创建较大的库时能加快时间。不管是否修改了库内容,都将更新符号表。

-t:将库目录写到标准输出,如果指定文件名称,则显示指定的文件。如果不指定文件名称的话,则显示库目录的所有文件。

-v:将建立新库的详细文件逐个写到标准输出。

例子:
在这里插入图片描述
例:静态库的使用

//add.c文件
#include "add.h"

int add(int a, int b)
{
    return a+b;
}

//add.h文件
#ifndef __ADD_H__
#define __ADD_H__
#include<stdio.h>
#include<stdlib.h>

int add(int a, int b);
#endif

//sub.c文件
#include "sub.h"
int sub(int a, int b)
{
    return a-b;
}

//sub.h文件
#ifndef __SUB_H__
#define __SUB_H__
#include<stdio.h>
#include<stdlib.h>

int sub(int a, int b);

#endif

//main.c文件
#include "add.h"
#include "sub.h"


int main()
{
    int a = 10;
    int b = 20;
    printf("add(%d, %d)=%d\n", a, b, add(a,b));
    
    a = 100;
    b = 20;
    printf("sub(%d, %d)=%d\n", a, b, sub(a,b));
}

运行静态库:

在这里插入图片描述
释:编译main.c文件时,将静态库mymath文件载入目标代码中,执行结果为10+20=30,100-20=80。其中,“-L”指定库路径,“.”指定当前目录,“-l”指定库名。

在这里插入图片描述
释:编译文件后,删除静态库,执行结果一样。

动态库

动态库的命名规则:
“libxxx.M.N.so”,其中“xxx”是库名,库名的前缀是“lib”(与静态库相同),“M”是库主版本号,“N”是库副版本号,“.so”是后缀。版本号可以省略,但是库名必须有。

工作过程:
动态库不被载入代码中,当程序执行到相应函数时才调用。

优点 :
占用的内存小;当动态库改变时,程序不受影响。

生成动态库:
在这里插入图片描述

(1)fPIC:表示产生位置无关码。

(2)shared:表示生产共享库格式。

注:动态库由目标文件生成

运行动态库 :
在这里插入图片描述
释:编译“main.c”文件时链接到动态库“mymath”。使用“-lmymath”标记是为了告诉gcc驱动程序在链接时引用“mymath”动态库。

注:生成静态库,动态库文件的时候,可能会出现这样的错误:
“/usr/bin/ld: cannot find lc”。在root权限下,执行“yum install glibc-static”命令安装glibc-static即可。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值