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

完~

相关推荐
左手の明天5 小时前
SLIP 协议封装与解析详解:原理、C 代码与实战案例
linux·c语言·开发语言·c++
꯭自꯭闭꯭5 小时前
达梦SQL优化相关
linux·运维·数据库·sql
ZhangJun955 小时前
在 32GB 内存电脑上本地搭建 Qwen3.6-35B-A3B 大模型踩坑实录
运维·人工智能·阿里云·ai·软件构建
一条破秋裤5 小时前
Linux 共享内存通信:POSIX 共享内存与 mmap
linux·运维·服务器
贵州山魈羡民6 小时前
【玩转手机】通过 Podroid 上的 Alpine 部署 1Panel,把微型服务器装进口袋
运维·服务器
小白的码BUG之路6 小时前
Docker -- 构建nacos镜像
运维·docker·容器
谷哥的小弟7 小时前
CentOS Stream浴火重生
linux·运维·centos
程序员-Benothing8 小时前
Shell输入输出详解:read、echo、printf、颜色输出
linux·运维·服务器
和裕8 小时前
全纸结构重型纸箱能否满足 1 吨以上设备出口熏蒸豁免要求?通关合规性全解析
大数据·运维·网络·人工智能·算法
FPGA小徐8 小时前
从 NEMU 到 AbstractMachine:程序、运行时环境与 AM 完全解析
linux·运维·服务器