make是一种控制编译或者重复编译软件的工具。make可以自动关键软件的编译内容、方式和时机,从而使程序员把更多的精力集中在编写代码上。make主要的机制是在命令行键入make命令,make会自动执行当前目录下的makefile文件makefile规则标号:依赖项(tab键)命令代码(tab键)命令代码--每个命令代码的第一个字符必须是tab键,而不是空格键,不然make会报错。命令行直接键入make,make默认只会执行第一个标号的命令代码
上图命令行详解start:hello.o--表示执行start标号下的命令行需要hello.o文件,如果当前目录下有hello.o文件,那么会直接执行start标号下的命令行;如果当前目录下没有hello.o文件,那么make会自动寻找生成hello.o文件的标号,找到hello.o标号,执行hello.o标号下的命令行,然后执行start标号下的命令行。
如果需要执行指定标号的命令行,必须使用make参数--make 需要执行的标号--例如:make clean
在make语法中"@"表示不打印该命令语句,只打印命令执行结果--例如@echo "-OK--" 只会打印-OK---
为了简化编辑和维护makefile,可以在makefile中使用变量。--varname=some_text把变量用括号扩起来,前面加上$符号就可以引用该变量的值--$(varname)按照惯例makefile的变量都是大写
$(SRCS:.c=.o)意思是将SRCS变量中的.c替换成.o
在makefile中用"#"来添加注释
make中的依赖声明.SUFFIXES:.c (一个空格) .o--这表明.o文件依赖于.c文件,.c和.o文件之间存在着依赖关系--强调:使用.SUFFIXES来表示两个文件的依赖关系,必须两个文件的文件名一致,只是文件类型不同才可以适应.SUFFIXES在make语句start:$(OBJS)中,表明依赖项是.o文件,根据.SUFFIXES声明,.o文件依赖于.c文件,找到".c.o"标签,执行该标签下的命令--$@表示生成的目标文件--$
make中多个.c文件联合编译--SRCS=hello.c\ (tab键)add.c--这表示有两个源文件,--OBJS=$(SRCS:.c=.o) 此时也会对应的生成两个.o文件--start:$(OBJS)这时候会发现两个依赖项,所以会执行".c.o"标签两次,从而生成两个.o文件。
make编译多文件时,会以.c文件的时间和.o文件的时间做对比,只编译修改过的.c文件,提高编译效率。
.PHONY:cleanWORKDIR=.VPATH = ./srcLIBOBJS= socketclient.o itcastlog.oOBJS= demo01_testplatform.oLIB1 = libmysocket.soEXE1 = mysocketexeCC = gccCFLGS= -Wall -g -I$(WORKDIR)/inc/LIBFLAG = -L$(HOME)/liball: $(LIB1) $(EXE1)$(LIB1):$(LIBOBJS) $(CC) -shared -fPIC $^ -o $@ cp $(LIB1) $(HOME)/lib mv $(LIB1) ./lib $(EXE1):$(OBJS) $(CC) $^ $(LIBFLAG) -lmysocket -o $@.c.o: $(CC) $(CFLGS) -c $< -o $@ -shared -fPICclean: rm -rf $(BIN) *.o $(HOME)/lib/$(LIB1) ./$(LIB1)