一、多文件编程结构组成

- 头文件中<>和“”的区别
include<stdio.h>
//在系统标准头文件目录中去找stdio.h文件
include"fun1.h"
//先在当前项目的源文件目录中去找fun1.h,找不到去系统找
使用建议:系统库头文件用<>,自定义头文件用""。
- 防止头文件重复定义(类型定义时)
示例:
#ifndef _ _ADD_H_ _
#define _ _ADD_H_ _
#endif
二、Makefile
工程管理工具,输入make,系统会查找当前目录下的Makefile文件根据规则对代码进行编译
1.makefile语法
要生成的文件:依赖的所有文件
生成规则
示例:
target: dependency1 dependency2
gcc dependency1 dependency2 -o target
%.o:%c
//任意的.o文件都依赖于.c文件
2.makefile中的变量
变量用于简化重复的文件路径、编译选项等,提升 Makefile 可维护性
(1)系统变量
$< 第一个依赖的文件
$@ 要生成的文件
$^ 所有依赖的文件,中间用空格隔开
(2)自定义变量
变量名 = 值
$(变量名)
${变量名}
(3)makefile中的赋值
= 赋值
:= 覆盖赋值
+= 在原来值的基础上再加新的值
?= 原来没值赋新值,原来有值则不赋值
3.gcc的编译选项
-E 完成预处理,编译成展开后的C语言代码
-S 完成预处理,编译,编译成为汇编代码
-c 完成预处理,编译,汇编,编译成为二进制代码
-o 指定生成文件的名字
-I 指定头文件的路径
-L 指定库文件的路径
-l 指定链接库的名称
-Wall 取出编译器优化,打印所有告警信息
-O 设置编译器优化级别
4. Makefile 三个常用的格式替换函数
wildcard 查找指定目录下满足格式的文件
//遍历找到add目录下所有.c文件放入SRCS变量中
SRCS := $(wildcard ./add/*.c)
patsubst 格式替换,根据格式将变量中的字符串完成替换
//将SRCS变量中所有的满足格式的.c格式替换为对应的.o
OBJS := $(patsubst ./add/*.c, ./build/*.o,$(SRCS))
notdir 去除文件路径,只留下文件名
//将SRCS变量中的所有文件去除路径,只留下文件名
OBJS := $(notdir $(SRCS))
示例:

5.编译步骤
通过 Makefile 自动化执行的编译步骤(从源码到可执行文件):
- 预处理(-E):展开头文件、替换宏、处理条件编译;
- 编译(-S):将预处理后的 C 代码转换为汇编代码;
- 汇编(-c):将汇编代码转换为二进制目标文件(.o);
- 链接:将所有.o 文件与库文件链接,生成可执行程序。

6.动态库和静态库
(1)库文件
代码实现的二进制形式,在链接时与源代码连接成一个可执行文件
(2)库文件分类
-
静态库
- 在编译时加载到程序中;
- 静态库会使代码体积增大;
- 多个程序使用同一静态库,需要分别加载各自独立的静态库;
- 删除静态库不会对代码运行产生影响。
-
动态库
- 在运行时加载到程序中;
- 动态库不会使代码体积增大;
- 多个程序可使用同一动态库,节省代码体积;
- 删除动态库,代码将无法运行。

