静态库和动态库

一、基础概念

1.c语言编译的过程?

预处理:将包含的头文件展开到include的地方,宏替换

gcc -E hello.c  -o  hello.i
//等价于下面这条命令
cpp  hello.c >hello.i

编译:编译的过程就是将 预处理 完的文件进行一系列的词法分析、语法分析、语义分析及优化,最后生成 .s 汇编代码文件

gcc -S hello.i  -o  hello.s

汇编:汇编器是将汇编代码转变成机器可以执行的指令(二进制), 每一条汇编代码几乎都对应着一条机器指令。最后生成一个* .o 目标文件

gcc -c hello.s -o hello.o //
//等价于下面命令
as hello.s -o hello.o

链接:链接就是将我们编译出来的目标文件和我们代码所用到的库文件一起打包成一个可执行文件的过程。

2.静态库和动态库的区别

1.静态库的代码在编译的过程中已经载入到可执行文件中,程序运行时,不再需要静态库,所以最后生成的可执行文件相对较大。
2.静态库链接的时候把库直接加载到程序中,而动态库链接的时候,它只是保留接口,将动态库与程序代码独立,这样就可以提高代码的可复用度和降低程序的耦合度;
3.程序运行时需要动态库的存在;
4.静态库后缀为.a;动态库后缀为.so

3.库的命名规则

libc.co.6
//lib  库文件前缀lib
//c		库名
//so	库扩展名
//6 	库文件版本号

二、如何做一个静态库,并使用

1.文件结构

在这里插入图片描述
//head.h

#ifndef _HEAD_H_
#define _HEAD_H_
#define N 20
extern int find_max(int a,int b);
#endif

//main.c

#include<stdio.h>
#include"head.h"

int main(int argc, const char *argv[])
{
	int x=20,y=10;

	int max=0;
	max=find_max(x,y);
	printf("N:%d\n",N);
	printf("max: %d\n",max);

	return 0;
}

//max.c

#include "head.h"

int  find_max(int a,int b)
{
	return a>b? a:b;
}

2静态库制作

(1)将 C 源文件(xx.c)编译成目标文件(xx.o);

gcc -c max.c -o max.o

(2)将目标文件打包成静态库

ar crs libmax.a max.o

静态库已经创建好了
注意:

ar 创建库的命令
c ---creat 创建
r ---repace 以替换的方式在库中插入模块
s ---symbol 将目标文件的索引符号表添加到库中

(3)静态库的使用
链接库和头文件生成a.out,或者在命令后 -o <程序名>,生成自定义程序名
用法:gcc 编译的文件.c -L 库的路径 -l 库的名字 -I 头文件所在路径

gcc main.c -L. -lmax -I.
//-L 告诉编译器库所在的路径
//-l 告诉编译器库的名字(例如:max)
//-I 告诉编译器头文件所在的路径

注:Linux 系统中链接器默认查找的库文件路径为/lib 和/usr/lib
Linux 系统中头文件默认查找的路径为/usr/include

三、如何做一个动态库,并使用

(1)先得到与位置无关的代码的目标文件;

gcc -fPIC -c max.c  //生成max.o文件
//注 :-fPIC 作 用 于 编 译 阶 段 , 告 诉 编 译 器 产 生 与 位 置 无 关 代 码
//(Position-Independent Code),则产生的代码中,没有绝对地址,全部使用相
//对地址,故而代码可以被加载器加载到内存的任意位置,都可以正确的执行。共
//享库要求,被加载时,在内存的位置不是固定的。

(2)生成动态库

gcc -shared max.o -o libmax.so

(3)把动态库路径加入环境变量,或者把动态库加入默认动态库的路径**/usr/lib** 或者**/lib** 下。只有这样才能在运行程序时,程序能够找到动态库并调用。

sudo cp libmax.so /usr/lib/

//或者把动态库所在路径加入到环境变量中

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/.......

(4)使用动态库

gcc main.c -L . -lmax -I.// 和静态库用法一样,生成a.out 程序

(5)运行程序

./a.out -lmax

end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jun8086

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值