姜鹏辉的个人博客 GreyNius

【C】makefile的编写

2019-11-09

makefile的好处就是制定好规则就可以快速的编译一个项目,当我仅仅修改了一份源代码的时候,Makefile可以通过时间戳判断哪些文件需要重新编译

例如有以下几个文件:

main.c
a.h
a.c
b.h
b.c

规则

目标:依赖
    命令

命令之前需要有一个【tab】制表符. 依赖太长的时候需要用反斜杠【\】换行

依赖文件必须写全,当依赖被修改的时候,目标才会重新构建

main: main.o a.o b.o
    gcc -o main main.o a.o b.o
main.o:main.c a.h b.h
    gcc -c main.c
a.o: a.c a.h
    gcc -c a.c
b.o: b.c b.h
    gcc -c b.c

定义变量

定义一个变量,使用$(变量名)调用
例如

object = main.o a.o b.o
main:$(object)
gcc -o main $(object)

clean规则

可以使用clean清除编译中生成的object文件,例如

clean:
    rm -fv $(object)

使用make clean执行

.PHONY规则 & all规则

.PHONY两个用途

  1. 防止某个规则和同名文件冲突
  2. 如果某个规则并不产生目标文件,则make不会执行,把这个规则指定为.PHONY即可

all规则的用途:希望生成多个目标的时候用这个

举例:

object = main.o a.o b.o
all:main clean
main:main.c
    gcc main.c -o main
.PHONY:clean
clean:
    rm -fv $(object)

自动推导

在目标文件是.o文件的时候,依赖文件可不用写.c 并且会自动推导出相关的编译命令,例如:

main.o:main.c a.h b.h
    gcc -c main.c
a.o: a.c a.h
    gcc -c a.c
b.o: b.c b.h
    gcc -c b.c

可以简写成

main.o: a.h b.h
a.o: a.h
b.o: b.h

特殊变量

  • $@ 目标文件
  • $^ 所有的依赖文件
  • $< 第一个依赖文件

最终效果:

object = main.o a.o b.o
main: $(object)
    gcc -o $@ $^
main.o: a.h b.h
a.o: a.h
b.o: b.h
clean: 
    rm -fv $(object)

参考

  1. https://www.jianshu.com/p/3c91ec0b8f05
  2. http://blog.chinaunix.net/uid-28458801-id-3452277.html

Similar Posts

Comments