前面学习了怎么使用cmd下编译可执行文件,可以看来在cmd下编译比较麻烦,特别当项目比较大的时候,cmd下就显得极繁琐。这时候需要使用makefile脚本,相对来说就容易多了。首先学习一下makefile的基本结构:
target ...:prerequisites ....
recipe
......
......
这里recipe前面一定是tab键,否则make就会报错。target就是要生成的目标,prerequisites是target的依赖,接下来recipe是动作,一般是怎么生成target。以之前的那个工程为例,它的makefile脚本是这样的:
VPATH = `pwd`
INCLUDE = $(addprefix -I, $(VPATH))
hello:hello.c file1
gcc $^ -o $@
file1:file1.c file1.h
gcc -c $< -o $@ $(INCLUDE)
all:
@echo $(VPATH) $(INCLUDE)
.PHONY:clean
clean:
rm file1 hello这里主要提一下几个注意点:1.makefile里面的第一个目标就是你最终想要得,在这里是hello。为什么要这么作呢?我的理解是make是一个lazy evaluatio的系统,只要完成了任务就可以了。在这个例子里面,如果将file1那个规则放在第一个上面,make就只会完成file1的编译,hello就不会在编译了。所以在写这些的时候一定要按照top-down的方法来些。
上述几个makefile知识点:addprefix 加前前zui,因为要加-I这个,$^是指所以的依赖,$<指第一个依赖;make 在编译的时候会自动替代,因此不需要再麻烦自己了,这些特殊符号叫自动变量;.PHONY是在脚本中定义一个符号,使得结构更加清楚,使用的时候可以直接make all这样。另外VPATH是make定义的环境变量,用来提供搜索目录的。但是这里有一个问题:如果编译file1的时候不把那个INCLUDE加进来,会提示说file1.h找不到。不是说要优先在本地的吗?找不到本地再在VPATH中搜索吗?