什么是库:库是写好的现有的,成熟的,可以复用的代码,可以被我们的程序直接链接使用,库本质是源文件->.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强制编译器静态链接。
完~