用户工具


makefile

一个指定编译规则的脚本。主要对象是C,C++


makefile工作流程

  • 所有的源文件没有被编译过,则对各个C源文件进行编译并进行链接,生成最后的可执行程序;
  • 每一个在上次执行make之后修改过的C源代码文件在本次执行make时将会被重新编译;
  • 头文件在上一次执行make之后被修改。则所有包含此头文件的C源文件在本次执行make时将会被重新编译。
  • make 过程,make 先找到指定目标,如果没有指定的话,那就默认编译第一个目标main,在编译目标main的时候会接着去找main目标的依赖的其他目标依次类推,确保所有依赖的目标先执行完毕
  • 如果只输入make 则执行第一个目标
  • 如果依赖.o文件,make命令会自动将.c文件编译成.o文件。
  • 如果目标A依赖目标B和C,那目标B和C命令产生的结果也一定要满足A的命令的使用,如目标A依赖目标B和C,且需要B.o,C.o,那么目标B和C的执行结果一定要产生B.o和C.o

makfile语法

目标: 依赖
        要执行的命令

编译规则

简单例子

main:main.o first.o#这里完全可以不用first.o命名,只要这个目标能生成main目标需要的组件(这里是first.o)就ok了。这里写first.o只是为了直观而已
        gcc main.c first.o -o result.out
first.o:first.c first.h
        gcc -c first.c
clean:
        rm -r main.o first.o result.out

解释

  1. 有目标main,依赖于main.o first.o 。要执行的命令用于产生最终的可执行程序
  2. 有目标first.o,依赖于first.c first.h。要执行的命令用于产生first.o
  3. 有目标chean,用于清除所有的中间文件

高级用法

OBJS=main.o first.o second.o #定义变量
SIGN=1 #定义变量
main:$(OBJS) #使用变量
ifeq ($(SIGN),1) #if 判断
        gcc $(OBJS) -o result
else
        echo hello
endif
midfile:main.o first.o second.o#伪目标,用来检查依赖目标
first.o:first.c first.h
        gcc -c first.c
second.o:second.c second.h
        gcc -c second.c
clean:
        rm -r *.o result