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 $@

 

 

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM