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

完~

相关推荐
toooooop81 分钟前
CentOS 7 内核 3.10.0-1160.119.1 升级指南
linux·运维·centos
云飞云共享云桌面4 分钟前
广东东莞制造工厂10人共享一台三维设计服务器
运维·服务器·3d·自动化·制造
码少女16 分钟前
Linux——UDP协议和TCP协议
linux·网络·udp·tcp
GeW39 分钟前
新质生产力发展路线图Linux、数据库、AI 一个都不能少
linux
kkkkkkkkkk_Z1 小时前
新手自学嵌入式 | 学习日记:Linux驱动复习之系统移植(U-Boot篇)
linux·运维·学习
Rabitebla1 小时前
【系统性学习笔记】Linux 权限篇(二):文件属性、权限修改与目录权限的底层逻辑
linux·c++·笔记·学习·算法
hz567891 小时前
企业视频会议系统方案:总部与分支机构高效协同如何落地?
运维·服务器·网络·安全·实时音视频·信息与通信
sun153690275722 小时前
露天矿边坡滑坡怎么预警?QY-19GNSS 自动化地表位移监测系统介绍
运维·安全·自动化