<<请参考于此链接?
<<官方文档GNU Make Manual
Note:文件名必须是makefile或者Makefile。在终端输入make执行命令。
1、一份主程序代码(main.c)、三份函数代码(getop.c、stack.c、getch.c)以及一个头文件(calc.h)
终端输入:
gcc -o calc main.c getch.c getop.c stack.c
2、最简单的makefile文件,最基本的Makefile语句:
calc: main.c getch.c getop.c stack.c
gcc -o calc main.c getch.c getop.c stack.c
以上语句分为三个部分:
第一行 calc,称为目标(target),被认为是这条语句所要处理的对象。
第一行 main.c getch.c getop.c stack.c ,称为依赖关系表,即编译calc所需要的文件。
第二行 gcc -o calc main.c getch.c getop.c stack.c,称为命令部分。只要包含的文件更新了,make就会执行该命令。
3、为了工作效率,改进代码
cc = gcc
prom = calc
source = main.c getch.c getop.c stack.c
$(prom): $(source)
$(cc) -o $(prom) $(source)
以上代码,定义了三个宏。 ps:在自己的makefile文件中,只需要改写 cc,prom,source 的赋值即可。
4、继续改进代码(这样可以解决当只修改一个文件时却要全部重新编译的问题!)
cc = gcc
prom = calc
deps = calc.h
obj = main.o getch.o getop.o stack.o
$(prom): $(obj)
$(cc) -o $(prom) $(obj)
main.o: main.c $(deps)
$(cc) -c main.c
getch.o: getch.c $(deps)
$(cc) -c getch.c
getop.o: getop.c $(deps)
$(cc) -c getop.c
stack.o: stack.c $(deps)
$(cc) -c stack.c
5、简化上述代码
cc = gcc
prom = calc
deps = calc.h
obj = main.o getch.o getop.o stack.o
$(prom): $(obj)
$(cc) -o $(prom) $(obj)
%.o: %.c $(deps)
$(cc) -c $< -o $@
其中,
%.o:%.c,这是一个模式规则,表示所有的.o目标都依赖于与它同名的.c文件。
$< 表示依赖关系表中的第一项(如果我们想引用的是整个关系表,那么就应该使用$^),即%.c。
$@表示当前语句的目标,即%.o。
最后,make命令会自动将所有的.c源文件编译成同名的.o文件。
6、自动清理编译产生的“残留”
cc = gcc
prom = calc
deps = calc.h
obj = main.o getch.o getop.o stack.o
$(prom): $(obj)
$(cc) -o $(prom) $(obj)
%.o: %.c $(deps)
$(cc) -c $< -o $@
clean:
rm -rf $(obj) $(prom)
在终端中。执行make clean命令时,它会去删除该工程生成的所有编译文件。
7、若需要往工程中添加一个或多个.c或.h,那么代码需要如下改进:
cc = gcc
prom = calc
deps = $(shell find ./ -name "*.h")
src = $(shell find ./ -name "*.c")
obj = $(src:%.c=%.o)
$(prom): $(obj)
$(cc) -o $(prom) $(obj)
%.o: %.c $(deps)
$(cc) -c $< -o $@
clean:
rm -rf $(obj) $(prom)
这样做,可以找出当前目录下所有的.c和.h文件。
$(src:%.c=%.o) 是一个字符替换函数,它会将src所有的.c字符串替换成.o,相当于列出了所有.c文件编译后的结果。