1.了解make:
(1)除非最简单的项目,任何一个商业项目都会包含多个源代码,而且在编译的时候会有很长很复杂的指令。
(2)编程过程中还需要使用那些很少而且很难记忆的编译选项。
(3)make是一种控制编译或者重复编译软件的工具。
(4)make可以自动管理软件的编译内容、方式和时机,从而使程序员把更多的精力集中在编写代码上。
2.简单的例子:
用vi编辑一个简单的makefile,内容如下:
start:
gcc hello.c -o hello
输入make,makefile的内容执行了。
如果是makefile是其他名字,比如makefile1,则输入make -f makefile1
稍微复杂的makefile,内容如下:
start:hello.o
gcc -o hello hello.o
hello.o:
gcc -o hello.o -c hello.c
clean:
rm -f hello.o
target start后面的hello.o代表其下的command依赖与hello.o这个target。所以make先执行了hello.o这个target下的command。
增加了target clean。
输入make clean,make会直接执行clean其下的command。
3.makefile: @ $的使用
CC=gcc #CC 就是 gcc 宏定义
start:hello.o
@#使用变量的方式 $(变量名称)
$(CC) hello.o -o hello -g
@#输出ok,@代表不输出指令本身
@echo "-----------ok-----------"
hello.o:
$(CC) -c hello.c -o hello.o -g
clean:
rm -f hello.o
4.增加变量SRCS、OBJS、EXEC,每个引用变量CC的地方的展开成变量的值
潜规则:
对于.o文件,变量名称OBJS
对于.c文件,变量名称SRCS
CC=gcc #CC 就是 gcc 宏定义
SRCS=hello.c
OBJS=hello.o
EXEC=hello
start:$(OBJS)
@#使用变量的方式 $(变量名称)
$(CC) $(OBJS) -o $(EXEC) -g
@#输出ok,@代表不输出指令本身
@echo "-----------ok-----------"
$(OBJS):
$(CC) -c $(SRCS) -o $(OBJS) -g
clean:
rm -f $(OBJS)
5.替代
OBJS=$(SRCS:.c=.o),意思是将SRCS变量中的.c替换为.o
等号两边不能有空格
CC=gcc #CC 就是 gcc 宏定义
SRCS=hello.c
OBJS=$(SRCS:.c=.o) #OBJS=hello.o
EXEC=hello
start:$(OBJS)
@#使用变量的方式 $(变量名称)
$(CC) $(OBJS) -o $(EXEC) -g
@#输出ok,@代表不输出指令本身
@echo "-----------ok-----------"
$(OBJS):
$(CC) -c $(SRCS) -o $(OBJS) -g
clean:
rm -f $(OBJS)
6 .SUFFIXES:.c .o
.SUFFIXES:.c .o
CC=gcc
SRCS=hello.c\
test.c
OBJS=$(SRCS:.c=.o)
EXEC=hello
start: $(OBJS)
$(CC) -o $(EXEC) $(OBJS)
@echo "------------------ok---------------"
.c.o:
$(CC) -Wall -o $@ -c $<
clean:
rm -rf $(EXEC) $(OBJS)
用makefile,只有项目当中修改过的.c文件才编译,没有修改的.c文件不会重新编译,这样会大大的加快编译的效率和时间
make程序是根据.c和.o文件的最后修改时间来判断.c文件是否需要重新编译的。
不建议每次都把所有的.o文件都删除,因为这样会导致make重新编译项目当中所有的源文件.
容易犯的错误
make只关心.c文件和.o文件的时间差,并不关心.h文件和.c文件的时间差。如果出现项目当中只是修改了.h文件,但并没有修改.c的文件的情况,就需要将所有include这个.h文件对应的.c文件的o文件删除,强制让make重新编译.c文件.