库文件(轮子)
库文件:目标文件的集合
*.o
- 静态库和动态库
- 农用车: 静态库(将库打包到产品[可执行程序库])
- F1赛车:动态库(运行时才能加载到可执行程序)
可执行大小 | 部署难度 | 升级难度 | |
---|---|---|---|
静态库 | 大 | 易 | 难 |
动态库 | 小 | 难 | 易 |
生成静态库
- 生成目标文件
gcc -c *.c
- 把目标文件打包成静态库
- 将静态库放到
/usr/lib
目录下 - 链接时,需要加上静态库的名字
$gcc main.c -o main -lalgo
生成动态库
- 编译成目标文件 加上
-fpic
$gcc -c add.c sub.c mul.c div.c -fpic
- 把目标文件打包成动态库
$ gcc -shared add.o sub.o mul.o div.o -o libalgo.so
- 将动态库移动到
usr/lib
目录下 - 链接时加上
-lalgo
$ gcc main.o -o -lalgo
make(管理文件之间的依赖关系)
增量编译:修改了那个文件,就只需要编译那个文件
Makefile
(脚本文件)
- makefile :规则的集合
- 规则:
- 目标
- 依赖
- 命令
- 什么时候会执行命令?
- 目标不存在
- 依赖比目标新
Make原理
- DAG(有向无环图):表示文件之间的依赖关系
- 拓扑排序:任务调度,(图的深度优先遍历)
Makefile进阶(了解)
-
伪目标
-
变量
- 自定义变量
变量名:=值(只有字符串类型) 引用变量:$(变量名),如果变量名为单个字符,只可以省略()eg:$A
- 预定义变量
- 自动变量(随着规则的不同,自动变量具有不同的值)
-
内置函数
%
:去匹配上一个规则的依赖
Wildcard
通配符 :从目录中查找符合要求的文件名
patsubst
:根据模式进行替换