【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强制编译器静态链接。

完~

相关推荐
LUCKY-LIVING1 小时前
ELF File in linux
android·java·linux
深耕时光,自成山海1 小时前
for,while等循环
运维
bksczm2 小时前
popen解析
linux·运维·服务器
深念Y2 小时前
技术探索记录 在 Android 手机上运行 One API
android·linux·服务器·智能手机·go·交叉编译·服务
qetfw2 小时前
Debian 配置 AIDE 文件完整性检测:基线初始化、变更检查与数据库更新
linux·网络·数据库·debian
俊哥工具2 小时前
文件批量转换工具 本地运行更快更安全
运维·服务器·django·音视频·tornado
小生不才yz2 小时前
Linux设备与存储精读 · L02-02 | inode 与目录项:名字、元数据、数据分别在哪
linux
陈聪.2 小时前
HAProxy 知识整理:从负载均衡原理到实战配置
运维·负载均衡
AOwhisky4 小时前
Linux(CentOS)系统管理入门笔记(第二十一期)——防火墙管理(Firewalld)——zone、服务端口、富规则与端口转发
linux·运维·笔记·安全·centos·防火墙