静态库、动态库学习笔记

静态库、动态库学习笔记
库:是一种可执行代码的二进制形式,可被操作系统载入内存执行;是写好的、现有的、完善的可复制的代码。
库可分为静态库(.a或.lib)和动态库(.so或.dll)。
动静之分是因为链接阶段对库的处理不一样导致。
程序编译成可执行文件的过程:预处理–>编译–>汇编–>链接–>可执行文件。
静态库:在链接阶段,将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中,因此对应的链接方式是静态链接。
静态库:一组很多(.o/.obj)目标文件的集合,经过压缩打包形成的一个文件。
静态库的特点:
1、静态库对函数库的链接是放在编译时期完成的;
2、程序在运行时与函数库再无瓜葛,移值方便;
3、浪费空间和资源,因为所有相关的目标文件与牵涉到的函数库被链接合成一个可执行文件;
Linux下使用静态库只需要在编译的时候指定静态库的搜索路径(-L<库文件所在路径>),指定静态库名(-l<库名>)(说明:-l表示头文件的路径,-L表示库的路径)。
动态库:在程序编译时不会链接到目标代码中,而是在程序运行时才被载入(共享库)。
动态库在内存中只存在一份拷贝,而静态库用一次拷贝一次,所以,动态库较静态库很大程度上节约空间资源的浪费。
总结二者的区别:
1、静态库在程序编译时会被链接到目标代码中,程序运行时不在需要该静态库,因此,体积较大;
2、动态库在程序编译时并不会被链接到目标代码中,而在程序运行时才被载入,因此,程序运行时还需要动态库存在,因此,代码体积小;
动态库
建立一个源文件: max.c,代码如下:

int max(int n1, int n2, int n3)
{
int max_num = n1;
max_num = max_num < n2? n2: max_num;
max_num = max_num < n3? n3: max_num;
return max_num;
}
编译生成共享库:

gcc -fPIC -shared -o libmax.so max.c
我们会得到libmax.so

测试,链接动态库生成可执行文件
新建max.h, 写入内容如下,表示链接库的接口:

#ifndef MAX_H
#define MAX_H

int max(int n1, int n2, int n3);

#endif
建立一个使用max函数的test.c,代码如下:

#include <stdio.h>
#include “max.h”

int main(int argc, char *argv[])
{
int a = 10, b = -2, c = 100;
printf(“max among 10, -2 and 100 is %d.\n”, max(a, b, c));
return 0;
}
gcc test.c -L. -lmax 生成a.out,其中-lmax表示要链接libmax.so。
-L.表示搜索要链接的库文件时包含当前路径。

注意,如果同一目录下同时存在同名的动态库和静态库,比如 libmax.so 和 libmax.a 都在当前路径下,
则gcc会优先链接动态库。

静态库
写源文件,生成目标文件。
第一个源文件 my_print.c

#include <stdio.h>

void cout(const char * message)
{
fprintf(stdout, “%s\n”, message);
}
源文件2: my_math.c

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

int subtract(int a, int b)
{
return a - b;
}
使用gcc,为这两个源文件生成目标文件:

gcc -c my_print.c my_math.c
我们就得到了 my_print.o 和 my_math.o。

归档目标文件,得到静态库。
我们使用 ar 将目标文件归档:

ar crv libmylib.a my_print.o my_math.o
我们就得到了libmylib.a,这就是我们需要的静态库。

上述命令中 crv 是 ar的命令选项:

c 如果需要生成新的库文件,不要警告
r 代替库中现有的文件或者插入新的文件
v 输出详细信息
静态库命名规则:lib + 库名 +后缀.a
动态库命名规则:lib + 库名 +后缀.so

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值