makefile笔记-规则测试

以这个简单的makefile文件为列

# 生成可执行文件main
main:main.o
    cc -o main main.o
# 生成main.o对象文件
main.o:main.c
    cc -c main.c
# 清除指令,删除执行过程中生成的文件

# 伪目标
.PHONY:clean

clean:
    rm main main.o

规则格式

target...:prerequisites...
 command
  • target :目标
  • prerequisites:依赖文件
  • command:命令

1.探究target和prerequisite的作用

  1. 执行 make main.o
    • 运行日志 cc -c main.c
    • 生成了main.o 文件
  2. 再次执行make mian.o
    • 运行日志'main.o' is up to date,已经是最新了的
  3. 修改main.c文件后
    • 运行日志 cc -c main.c
    • 生成了main.o 文件
  4. 修改makefile文件为
main.o:
    cc -c main.c
  1. 执行 make mian.o
    • 运行日志 cc -c main.c
    • 生成了main.o 文件
  2. 执行 make mian.o
    • 运行日志 cc -c main.c
    • 生成了main.o 文件
      6.修改makefile文件为
main:main.c
    cc -c main.c
  • 执行结论和 4,5 的结果一样

结论

  1. 当target为目标生成文件的名称时,makefile会将目标名称对应的文件和依赖的文件进行最后修改时间对比,来判断是否需要执行命令生成新的文件,避免重复执行
  2. 不设置依赖文件或target名不是目标文件名 ,不影响target指令的执行

2.伪目标的问题

一些博客上说伪目标的做用是不生成目标文件

以上面clean目标为列

  • .PHONY:clean 代码时,执行make clean
    • 执行了删除指令,没有生成clean文件
  • 删除.PHONY:clean代码后,执行命令,也没有clean文件

结论

  1. 伪目标没有什么作用
  2. target名称本身不会产生文件,不是目标文件名时,仅充当方法名的作用

3.关于隐晦规则

  1. 删除一下代码
main.o:main.c
    cc -c main.c
  1. 执行 make
    • 日志cc -c -o main.o main.c
    • 日志cc -o run main.o

结论
C 编译过程中,有.o文件依赖时,如果没有显性规则生成.o文件,makefile会自动补全.o 的生成命令


ps:如有问题 欢迎交流 愿与君共勉


你可能感兴趣的:(makefile笔记-规则测试)