【Linux】:动静态库

朋友们、伙计们,我们又见面了,本期来给大家带来动静态库相关知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成!

C 语 言 专 栏:C语言:从入门到精通

数据结构专栏:数据结构

个  人  主  页 :stackY、

C + + 专 栏   :C++

Linux 专 栏  :Linux

目录

1. 静态库

1.1 静态库的创建

1.2 静态库的使用

①朴素做法:

②简便做法:

2. 动态库

2.1 动态库的创建

2.2 动态库的使用

① 安装(拷贝)至系统指定目录 

② 使用软链接

③ 通过环境变量查找

④ 更改系统配置文件

2.3 安装外部库

3. 动态库的加载(原理) 

① 库和程序都要加载

② 绝对编址和相对编址 

③ 基于地址空间理解加载


1. 静态库

静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库(静态库不需要加载);静态库的前缀以lib开头中间是库名称以.a为后缀结束。

库中是没有main函数的,我们也不能把main函数写入库中! 

将所有头文件和.o文件打包就叫做一个库。

1.1 静态库的创建

实现一个简单的计算功能的代码:包含 + - *功能的计算。

// 源Add.c
#include "Add.h"

int Add(int x,int y)
{
    return x + y;
}
// 源Sub.c
#include "Sub.h"

int Sub(int x,int y)
{
    return x - y;
}

// 源Mul.c
#include "Mul.h"

int Mul(int x,int y)
{
    return x * y;
}

// 源Test.c
#include "Add.h"
#include "Sub.h"
#include "Mul.h"

int main()
{
    int x = 10, y = 20;
    printf("%d + %d = %d\n", x, y, Add(x, y));
    printf("%d - %d = %d\n", x, y, Sub(x, y));
    printf("%d * %d = %d\n", x, y, Mul(x, y));
    return 0;
}

我们可以对全部的.c源文件一起编译形成一个可执行程序:

但是我们不建议将所有的源文件一起编译成可执行程序,通常先将所有的.c文件预处理、编译、汇编形成.o文件,然后使用哪几个源文件就将哪几个链接在一起(所以在VS2019中可以看到许多的.obj文件)。

gcc -c 源文件:将源文件汇编形成.o二进制目标代码;

为了方便,我们直接使用Makefile来自动形成.o文件和链接.o文件形成可执行。

Makefile文件:

Test:Add.o Sub.o Mul.o Test.o #将所有.o文件链接在一起形成可执行
	gcc -o $@ $^
%.o:%c       #将所有的.c文件汇编形成.o文件
	gcc -c $<

.PHONY:clean
clean:
	rm -f *.o Test

如果我们要形成一个库,只需要将.o文件和头文件保留,然后打包,如果用户有别的程序要使用,先将用户的源代码汇编形成.o文件,然后再和我们库中的.o文件链接即可。

静态库的创建:ar -rc lib库名称.a .o文件...

// 生成静态库
[root@localhost linux]# ar -rc libmymath.a add.o sub.o

为了方便,在Makefile中也可以使用生成静态库的脚本:

Makefile文件:

static-lib=libmymath.a 

$(static-lib):Add.o Sub.o Mul.o
	ar -rc $@ $^

%.o:%c      
	gcc -c $<
	
.PHONY:clean
clean:
	rm -f *.o *.a

静态库的本质:将库中的源代码直接翻译成为.o目标二进制文件,然后将其打包! 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

stackY、

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

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

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

打赏作者

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

抵扣说明:

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

余额充值