1.工程管理器:编译很多文件,(类型不同,存放在不同目录,资源文件使用)组成的软件代码结构
2.make读取makefile里的内容,实现自动编译
“自动编译”
(a)根据makefile文件的内容进行自动编译
(b)根据文件的时间戳来判断文件是否需要编译
3.makefile是个脚本文件(批处理)
makefile语法
目标:依赖
按下tab键 命令
解释:执行命令依赖这个文件,最终生成目标
makefile执行顺序:自上向下,当你的目标依赖的文件又是一个目标时,会先跳转到该目标去执行相关命令
make+目标名 :从该目标开始自上向下执行
4.伪目标:只执行命令,不生成对应的文件
.PHONY:clean install
5.在命令前面加@可以避免命令回显
echo 在终端上输出字符串
例如@echo make hello.c done
内置变量**$@**可以替代目标
**“#”**注释
定义变量
makefile分类
(1)总控makefile:进入各个功能目录(功能目录管理软件代码),执行make命令,并将所有.o文件链接成可执行文件
(2)功能目录makefile:将功能目录下的源文件编译生成目标文件
(3)scripts目录头文件makefile:定义变量,供其他makefile使用
下面是一个demo的自学情况
(1)scripts目录头文件makefile里的内容如下
CC :=gcc
CFLAGS := -Wall -03
Libs = -lpthread
Target := client
ccSource :=$(wildcard src/*.c #列出当前目录下src目录的所有.c文件
objs := $(patsubst %.c,%,o,$(Source)) #将source里的.文件编译成.o文件
Modules += check_putin pack_message main #当前软件代码所有的功能目录
A11objs :=$(addsuffix /src/*.o,$(Modules)) #Allobjs:列出所有功能目录下的src目录下的.o文件
wildcard
格式:$(wildcard模式参数)
功能:列出当前目录下所有符合模式参数的文件名
返回值:当前目录下所有符合模式参数的文件名
例如:
result := $(wildcard *.c)
result的值为当前目录下所有的C文件名。
ccSource :=$(wildcard src/*.c)
//这里ccSource返回的就是src目录下所有.c的文件
patsubst
格式:$(patsubset模式参数,参数1,参数2)
功能:把参数2中符合模式参数的单词(单词是指参数中被空格隔开的字符串)替换成参数1
返回值:被替换后的参数2
objs := $(patsubst %.c,%,o,$(Source))
//把source这个文件里符合.c的文件全部替换成。o文件
addsuffix
格式:$(addsuffix 参数1,参数2)
功能:在参数2中的每个单词加上后缀参数1
返回值:加上后缀的所有单词
A11objs :=$(addsuffix /src/*.o,$(Modules))
//
(2)总控makefile代码如下
modules_make = $(MAKE) -C $(1); //进入$(1)所在的目录执行make命令
定义了四个伪目标
(3)功能目录下的makefile代码如下
如果我们想要用上述结构编写makefile
首先建立功能目录例如 mkdir -p add/src main/src scripts
然后将对应的.c文件拷到对应的功能目录下
然后剪切makefie模板
修改scripts下面的Makefile,将Target以及Modules进行修改