最近在学习韦东山老师的makefile,感觉只看视频总是看了前面忘了后面,所以决定将理解过程记录下来,在巩固自己所学基础上对大家有所帮助。先贴入代码如下:
整个文件按照功能可以划分为几个模块:
1.编译及链接变量的定义
2. 编译及链接流程
3. 清空操作流程
4.全面清空操作流程
下面按照这几个模块进行解析:
(1)编译及链接变量的定义
CROSS_COMPILE = //声明延时变量CROSS_COMPILE
AS = $(CROSS_COMPILE)as//定义汇编编译器的名称
LD = $(CROSS_COMPILE)ld//定义链接器的名称
CC = $(CROSS_COMPILE)gcc//定义C语言编译器
CPP = $(CC) -E//定义C语言预编译器,-E是编译选项的 预处理
AR = $(CROSS_COMPILE)ar //定义库管理器,将多个可重定位的目标模块归档为一个函数库文件
NM = $(CROSS_COMPILE)nm //列出目标文件的符号清单
STRIP = $(CROSS_COMPILE)strip//去掉elf可执行文件的信息
OBJCOPY = $(CROSS_COMPILE)objcopy//定义文件格式转换器,把ELF格式的文件转换成二进制文件
OBJDUMP = $(CROSS_COMPILE)objdump//定义交叉反汇编器,将可执行文件反汇编后输入保存到dump文件中
//让下列变量的值在所有目录中都可见
export AS LD CC CPP AR NM
export STRIP OBJCOPY OBJDUMP
CFLAGS := -Wall -O2 -g//定义C 编译器的选项
-Wall:打开了所有需要注意的警告信息
-O2: 多优化一些
-g:以操作系统的本地格式(stabs,COFF,XCOFF,或DWARF)产生调试信息
CFLAGS += -I $(shell pwd)/include//使用 shell的pwd命令获取相对路径的include文件夹路径并作为第一个寻找头文件的目录
LDFLAGS := //定义链接选项
export CFLAGS LDFLAGS
TOPDIR := $(shell pwd)//使用 shell的pwd命令获取相对路径
export TOPDIR
(2) 编译及链接流程
TARGET := test//定义目标名称
obj-y += main.o//把当前目录下的main.o编进程序里
obj-y += sub.o//把当前目录下的sub.o编进程序里
obj-y += a/ //表示要进入a这个子目录下去寻找文件来编进程序里,是哪些文件由a目录下的Makefile决定
all : start_recursive_build $(TARGET)//定义执行make时的默认目标
@echo $(TARGET) has been built! //输出TARGET执行生成结果
start_recursive_build: //定义编译规则
make -C ./ -f $(TOPDIR)/Makefile.build//“-C”选项指定切换到“./“目录中去,“-f”指定使用顶层文件夹下的Makefile.build文件来生成TARGET目标
$(TARGET) : built-in.o //TARGET的依赖是built-in.o
$(CC) -o $(TARGET) built-in.o $(LDFLAGS) // gcc -o test built-in.o,使用built-in.o生成test
(3)清空操作流程
rm -f $(shell find -name "*.o")//使用shell的find命令来查找*.o文件,并删除
rm -f $(TARGET)//删除test文件
(4)全面清空操作流程
rm -f $(shell find -name "*.o")//使用shell的find命令来查找*.o文件,并删除
rm -f $(shell find -name "*.d")//使用shell的find命令来查找*.d文件,并删除
rm -f $(TARGET)//删除test文件
没有解决的问题是如果当前的编译环境中定义了CROSS_COMPILE,这个变量会不会自动被赋值为环境变量值?请各路高人指点,谢谢