Makefile (3) 基本语法和使用

make是用来管理一个工程项目的工具 .

Makefile就是这个项目文件 .

1.Makefile 是由若干条规则组成的,每个规则的语法如下所示 :

  #规则
  targets: prerequisites
      command
 #举例 main.c func1.c
  hello: main.o func1.o
      gcc main.o func1.o -o hello
      
  main.o: main.c
      gcc -c main.c
  func1.o: func1.c
      gcc -c func1.c

 

2.makefile的时间戳

  对于已经编译过一次的工程,如果没有对源文件进行修改,目标文件是不会重复编译的,这样编译效率比较高.

  也就是说,如果目标文件和依赖文件的时间戳是一样的,就不会重新编译,

  如果目标文件的时间戳比依赖文件的时间戳旧,就会重新编译.

 

3.伪目标

  对于工程的清理, 需要写一个clean功能,这种类似的功能, 不需要依赖文件,这种命令 称作 伪目标.

 #伪目标 
  # .PHONY: xxx .PHONY: clean
  clean:
      rm -rf *.o hello
      
  .PHONY: install
  install:
      cp hello /usr/bin
      
  .PHONY: uninstall
  uninstall:
      rm /usr/bin/hello

 

 

4.makefile 的变量

  1.用户自定义变量
  2.预定义变量
  3.自动变量
  #用户自定义变量 --
  OBJ = main.o func1.o ...
  hello : $(OBJ)
      gcc $(OBJ) -o hello
      
  #预定义变量
  AR --> ar
  CC --> 编译器
  ARFLAGS --> 库编译选项
  CFLAGS --> C编译器选项
      #举例 CFLAGS = -g -c
      gcc $(CFLAGS) func.c
      
  #自动变量
  $* --> 不包含扩展名的目标文件名称 #main.o : main.c   $* 表示main.o 中的main
  $< --> 表示第一个依赖文件的名称
  $? --> 所有时间戳比目标文件晚的依赖文件
  $@ --> 目标文件的完成名称
  $^ --> 所有不重复的依赖文件
      # hello : main.o func1.o
      #   $(CC) $^ -o $@
 

5.makefile 条件判断

  #条件判断不能用tab 打头
  hello: main.o func1.o
  ifeq ($(CC),gcc)
      gcc $^ -o $@
  else
      $(CC) $^ -o $@
  endif

 

6.Makefile的嵌套和引用

  一个工程是由一层一层Makefile的嵌套组成的 .每个Makefile文件负责管理不同的部分,然后通过嵌套和引用,来管理整个工程的源码 .

  #包含
  include proc/makefile
  ​
  #嵌套
  subsystem:
  $(MAKE) -C subdir

 

7.makefile 管理命令

-C dir执行指定文件夹下面的makefile
-f file 读入当前文件夹下的file 为 Makefile
-i 忽略所有命令执行的错误
-I dir 指定被包含(include)的Makefile 的路径
  -C 用于迭代,
  /-
   |-Makefile
   |-srcA
   |  |-xx.c
   |  |-Makefile
   |
   |-srcB
      |-xx.c
      |-Makefile
      
  #在根目录下的Makefile
      $(MAKE) -C srcA
      $(MAKE) -C srcB

 

8.用伪目标生成多个文件

 .PHONY: all
  all: tar1 tar2 tar3
   
  tar1: tar1.o
      $(CC) $^ -o $@
  ​
  tar2: tar2.o
      $(CC) $^ -o $@
      
  tar3: tar3.o
      $(CC) $^ -o $@

 

 

 

 

posted @ 2018-12-31 11:22  kmist  阅读(2458)  评论(0编辑  收藏  举报