【Linux系统编程】库的制作与使用

什么是库:库是写好的现有的,成熟的,可以复用的代码,可以被我们的程序直接链接使用,库本质是源文件->.o文件的集合(二进制文件)。

动态库:.a【Linux】、.lib【Windows】

静态库:.so【Linux】、.dll【Windows】

可以通过 /lib64 或/usr/lib64 搜索库文件

1.静态库的制作和使用

1.1 静态库的制作

makefile:

bash 复制代码
target=libmyc.a
src=$(wildcard *.c)
obj=$(src:.c=.o)
cc=gcc -c
ar=ar -rc

$(target):$(obj)
	$(ar) $@ $^
%.o:%.c
	$(cc) $<

.PHONY:output
output:
	@mkdir -p myc/lib
	@mkdir -p myc/include
	@cp *.h myc/include
	@cp *.a myc/lib
	@tar czf myc.tgz myc

.PHONY:clean
clean:
	rm -rf *.o $(target) myc myc.tgz

debug:
	@echo $(target)
	@echo $(src)
	@echo $(obj)

ar -rc: 该命令是用来创建或更新静态库(.a 文件)的核心工具。简单来说,它可以把一堆.o 目标文件打包成一个库文件。

1.2 静态库的使用

bash 复制代码
// 场景1:头⽂件和库⽂件安装到系统路径下
$ gcc main.c -lmystdio

// 场景2:头⽂件和库⽂件和我们⾃⼰的源⽂件在同⼀个路径下
$ gcc main.c -L库文件路径 -lmymath

// 场景3:头⽂件和库⽂件有⾃⼰的独⽴路径
$ gcc main.c -I头⽂件路径 -L库⽂件路径 -lmymath

-L: 指定库路径

-I: 指定头文件搜索路径

-l: 指定库名

2.动态库的制作和使用

动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。

⼀个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的⼀个表,而不是外部函数所在目标文件的整个机器码

在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接(dynamic linking)

动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间。操作系统采用虚拟内存机制允许物理内存中的⼀份动态库被要用到该库的所有进程共用,节省了内存和磁盘空间。

2.1 动态库的制作

makefile-so:

bash 复制代码
target=libmyc.so
src=$(wildcard *.c)
obj=$(src:.c=.o)
cc=gcc

$(target):$(obj)
	$(cc) -shared -o $@ $^
%.o:%.c
	$(cc) -fPIC -c $<

.PHONY:output
output:
	@mkdir -p myc/lib
	@mkdir -p myc/include
	@cp *.h myc/include
	@cp *.so myc/lib
	@tar czf myc.tgz myc

.PHONY:clean
clean:
	rm -rf *.o $(target) myc myc.tgz

debug:
	@echo $(target)
	@echo $(src)
	@echo $(obj)

shared:表示生成共享库文件

fIPC:产生位置无关码

库名规则libXXX.so

2.2 动态库的使用

bash 复制代码
//方法一 安装到系统路径下
$ gcc main.c -lmystdio

//方法二 建立软连接 
ln -s libmyc.so libmyc.so.1.0

//方法三: 环境变量
在配置文件中添加LD_LIBRARY_PATH 的环境变量

动静态库同时存在时,默认动态链接,加上-static强制编译器静态链接。

完~

相关推荐
奇树谦6 分钟前
HDD 为什么适合顺序大文件读写:从 RAID 5 到 RAID 50 的原理与性能分析
linux·运维·网络
hi_ro_a34 分钟前
Linux基础开发工具详解
linux·运维·服务器
嵌入式阿蔡41 分钟前
Linux_01:交叉编译与开发环境实战——从单片机跨到 Linux 的第一道坎
linux·运维·网络·单片机·嵌入式硬件·嵌入式实时数据库
风静如云1 小时前
Openssl:Win11(Chrome)安装客户端证书
服务器
風穆1 小时前
OopsVPS:多云 VPS 比价平台的十大核心优势
大数据·服务器·云服务器·oopsvps
Pocker_Spades_A1 小时前
终端里也能斗地主:Linux部署Ratel,从本地对战到公网联机
linux·运维·服务器
佳児素花痴╮2 小时前
C语言链接库
linux·运维·服务器
雷电小将军2 小时前
诡秘之主手游占卜家序列加点 诡秘之主手游占卜家怎么加点
服务器·网络·游戏·电脑·玩游戏
云飞云共享云桌面2 小时前
苏州昆山精密机械加工厂研发部门10个SolidWorks可以部署云飞云共享云桌面吗?
大数据·运维·服务器·自动化·汽车·制造
聚美智数2 小时前
图片水印-图片剪裁-图片缩放API接口介绍
java·服务器·数据库