快速上手Makefile(或makefile)

<<请参考于此链接?

<<官方文档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文件编译后的结果。

 

你可能感兴趣的:(日常操作(小笔记),make,Makefile,makefile)