文章目录
什么是库
- 静态库:.a Linux .lib windows
- 动态库:.so Linux .dll windows
静态库
- 静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中,程序运行的时候将不再需要静态库。
- 一个可执行程序可能用到许多的库,这些库运行有的是静态库,有的是动态库,而我们的编译 默认 为动态链接库,只要在该库下找不到动态.so的时候才会采用同名静态库。我们也可以使用gcc的 -static 强制设置链接静态库。
静态库生成
- ar:创建静态库的工具
- -r(replace):将文件插入库中(替换已存在的同名文件)
- -c(create):创建库时不显示警告信息
shell
1 libmyc.a:mystdio.o mystring.o
2 ar -rc $@ $^
3 mystdio.o:mystdio.c
4 gcc -c $<
5 mystring.o:mystring.c
6 gcc -c $<
7
8 .PHONY:output
9 output:
10 mkdir -p lib/include
11 mkdir -p lib/mylib
12 cp -f *.h lib/include
13 cp -f *.a lib/mylib
14 tar czf lib.tgz lib
15
16 .PHONY:clean
17 clean:
18 rm -rf *.o libmyc.a lib lib.tgz
myfile.c
先写一个测试文件进行测试,我们引入了一个自己写的头文件 mystring.h(里面只写了一个函数 my_strlen) 只引入怎么实现,但具体的实现我不说出来,直接运行一下代码,看一下会出什么问题。
cpp
1 #include"mystring.h"
2 #include<stdio.h>
3 int main(){
4 const char *s = "abcdefg";
5 printf("%s: %d\n",s,my_strlen(s));
6 return 0;
7 }
运行结果
发现找不到这个函数是怎么实现的。

解决以上问题
- -L:指定库路径
- -I:指定头文件搜索路径,不用指定到库(指定到库就是文件了)
- -l:指定库名
- 库文件名称和引入库的名称:去掉前缀lib,去掉后缀.so , .a 如:libmyc.a -> myc
- 场景一:头文件和库文件安装到系统路径下
shell
gcc -o myfile myfile.c -lmyc
- 场景二:头文件和库文件和我们自己的源文件在同一路径下
shell
gcc -o myfile myfile.c -L. -lmyc
运行结果

- 场景三:头文件和库文件有自己的独立路径
shell
gcc -o myfile myfile.c -I./lib/include -L./lib/mylib -lmyc
运行结果

动态库
- 动态库(.so):程序在运行的时候才去链接动态库的的撒艾玛,多个程序共享使用库的代码。
- 一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码。
- 在可执行文件开始运行之前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接。
- 动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间。操作系统采样虚拟内存允许物理内存中的一份动态库被要用到该库的所有进程共用,节省了内存和磁盘空间。
动态库生成
- shared:表示生成共享库格式
- fPIC:产生位置无关码
- 库名规则:libxxx.so
shell
1 libmyc.so: mystring.o
2 gcc -shared -o $@ $^
3 mystring.o:mystring.c
4 gcc -fPIC -c $<
5
6 .PHONY:output
7 output:
8 mkdir -p lib/include
9 mkdir -p lib/mylib
10 cp -f *.h lib/include
11 cp -f *.so lib/mylib
12 tar czf lib.tgz lib
13
14 .PHONY:clean
15 clean:
16 rm -rf *.o libmyc.so lib lib.tgz
动态库使用
头文件和库文件和我们自己的源文件在同一路径下。
shell
gcc -o myfile myfile.c -I. -L. -lmyc
函数找不到!!!


解决办法:临时拷贝到环境变量里面。
shell
LD_LIBRARY_PATH=. ./myfile

觉得我回答有用的话,记得点个关注哟!谢谢支持!