make工具是一个根据makefile文件内容,针对目标(可执行文件)进行依赖性检测(要生成该可执行文件之前要有哪些中间文件)并执行相关动作(编译等)的工具 。而这个makefile文件类似一个脚本,其中内容包含make所要进行的处理动作以及依赖关系。
makefile所要进行的主要内容是明确目标、明确目标所依赖的内容、明确依赖条件满足时应该执行对应的处理动作。例如我们最终要实现a这个目标,但是需要依赖b,而b依赖于c的存在,则可以描述为:
a:b
cmdbtoa
b:c
cmdctob
“:”代表依赖,另外每个处理动作之前都要用tab键分隔。上述四行的意思是:a依赖于b,而处理cmdbtoa;b依赖于c,而处理cmdctob。
gcc对C/C++的编译过程,共分为四部分,预处理,编译,汇编,链接。
makefile1:
C = gcc G = g++ CFLAGS = -Wall -O -g TARGET = ./test #表示把所有的.c、.cpp文件编译成.o文件。 # $ @扩展成当前规则的目的文件名 # $ <扩展成依靠列表中的第一个依靠文件 # $^扩展成整个依靠的列表(除掉里面所有重复的文件名)。 %.o:%.c $(C) $(CFLAGS) -c $< -o $@ %.o:%.cpp $(G) $(CFLAGS) -c $< -o $@ #表示产生一个所有以.c、.cpp结尾的文件列表,然后存入变量SOURCES里。 SOURCES = $(wildcard *.c *.cpp) #把SOURCES文件列表中所有.cpp变成.o、.c变成.o,然后形成一个新的列表,存入OBJS变量。 OBJS = $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(SOURCES))) $(TARGET):$(OBJS) $(G) $(OBJS) -o $(TARGET) #chmod a+x $(TARGET) 表示把firstTest强制变成可执行文件 chmod a+x $(TARGET) clean: rm -rf *.o test
makefile2:
#“:”代表依赖,另外每个处理动作之前都要用tab键分隔。 OBJS = test1.o test2.o G = gcc # CFLAGS = -Wall -O -g 配置编译器设置,并把它赋值给CFLAGS变量 # -Wall:输出所有警告信息 # -O:在编译时进行优化 # -g:表示编译debug版本 CFLAGS = -Wall -O -g test:$(OBJS) $(G) $(OBJS) -o test test1.o:test1.c test2.h $(G) $(CFLAGS) -c test1.c test2.o:test2.c test2.h $(G) $(CFLAGS) -c test2.c clean: rm -rf *.o test



