all:
gcc servo.c -o servo
clean:
rm -rf servo servo.o
main:main.o
gcc main.o -o main
main.o:main.c
gcc -c main.c
clean:
rm -rf main.o main
$* 不包括后缀名的当前依赖文件的名称
$+ 所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件
$< 第一个依赖文件的名称
$? 所有时间戳比目标文件晚的依赖文件,并以空格分开
$@ 目标文件的完整名称
$^ 所有不重复的目标依赖文件,以空格分开
-: 告诉make命令忽略所有的错误
@: 告诉make在执行命令前不要将改命令显示在标准输出上
在这里简单解释一下makefile中的相关命令:
CC = gcc #声明编译器
CFLAGS = -g -O -Wall #声明编译的选项
OBJ := add.o sub.o main.o #声明依赖的文件
TOPDIR := $(PWD) #声明顶级目录
OBJDIR := $(TOPDIR)/obj #定义编译中间文件的存放的目录
BINDIR := $(TOPDIR)/bin #定义可执行文件的存放目录
BIN := main #定义可执行文件的名称
SUBDIR := add sub main obj #声明所有的子目录
OBJHEAD := $(TOPDIR)/add/add.h $(TOPDIR)/sub/sub.h #声明所有的头文件
OBJLINK := --std=c99 #声明编译时候需要的链接护着其他的选项
export CC TOPDIR OBJDIR BINDIR BIN OBJLINK OBJ #到处所有的全局变量,给次级目录中的makefile只用
all:CHECKDIR $(SUBDIR)
mkdir -p $(SUBDIR) $(BINDIR)
对于makedir中的的选项:
-m 对新建目录设置存取权限。也可以用chmod命令设置。
-p 可以是一个路径名称。此时若路径中的某些目录尚不存在,加上此选项后,系统将自动建立好那些尚不存在的目录, 即一次可以建立多个目录。
make -C $@
当make的目标为all时,
-C $@ 指明跳转到次级目录下读取那里的Makefile;
M=$(PWD) 表明读取完Makefile(次级目录下Makefile)执行完成后返回到当前目录继续读入、执行当前的Makefile( 顶级目录下Makefile)。
clean:
关于clean的规则,在make clean的时候,并不产生目标文件,且没有依赖文件,所以命令都会执行,但如果目录中存在名为“clean”的文件或者目录,则规则没有依赖文件,且clean始终是最新的,所以命令不会被执行,为了避免这个问题,可以使用.PHONY来指明改目标,则将上述的clean部分修改为:
gcc -DLINUX -ICommon/Common Common/Common/*.cpp *.cpp -lpthread -ldl -fPIC-lpthread -ldl -fPIC
后续补充,,,,,,,