简述makefile文件

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/CY071512/article/details/79902034

简介:

   makefile相当于一种脚本语言,在编写makefile过程中可以使用变量、控制结构语句、函数等一般编程语言的特性,而makefile诞生的本质是实现自动化编译,为程序员谋福利。makefile区别于其他语言最大特点是:其执行是由所编译文件的依赖关系驱动的。


makefile文件的组成内容

  主要有以下五种组成部分:
1. 显示规则: 显示规则说明了生成一个或多个目标文件的方法和步骤,编写makefile文件时要包括生成的文件、生成文件的依赖文件以及生成的命令等
2. 隐式规则: make工具有自动推导功能,所以利用这个规则编写makefile文件时,可以简略的书写makefile
3. 文件指示:包括三部分,一部分是在一个makefile中引用另一个makefile(指令:make -f Makefile*);一部分是根据某些情况指定makefile中的有效部分;另一部分是定义一个多行的命令
4. 变量的定义:这些变量往往都是字符串,makefile被执行时,其中的变量会被展开到指定的引用位置上
5. 注释:‘#’字符


编写makefile规则

  makefile文件的文件名最好命名为makefile或者Makefile,因为在默认情况下,make命令会在当前目录下按照顺序寻找这两个文件进行解释。
  注意:make时要在当前目录下能够找到makefile或者Makefile文件

  • 1.调用格式:
目标:依赖文件
【Tab键】命令
main:main.o add.o sub.o
     gcc  -g add.o sub.o main.o -o main
#目标main依靠依赖文件main.o add.o sub.o,
#而main.o依赖main.c,add.o依赖add.c,sub.o依赖sub.c
#所以想生成main,就必须调用下面三条指令生成依赖文件,在生成目标
main.o : main.c
    gcc -c -g main.c -o main.o
add.o : add.c
    gcc -c -g add.c -o add.o
sub.o : sub.c
    gcc -c -g sub.c -o sub.o

  make命令将执行该makefile文件中命令编译整个工程,默认make会执行makefile第一条规则,比如上述例子的目标就是可执行文件main,但是main依赖三个文件main.o,add.o,sub.o,如果依赖文件没有,将会去下面查找,所以上述例子会先去下面查找、生成三个依赖文件,再生成可执行文件main。

  • 2.伪目标的创建:
      伪目标不是真正的文件,所以make命令无法对其生成依赖文件,所以一定会去执行伪目标。
      用标记.PHONY来显示的声明一个伪目标:
.PHONY:clean
...
clean:
[Tab键]rm -rf *.o

  上述例子声明了一个伪目标clean,其作用是删除掉编译过程中产生的.o文件。
  用法:

# make clean

  效果:

[root@localhost project]# ls
add.c  add.h   main.c sub.c  sub.h  Makefile
[root@localhost project]# cat Makefile
.PHONY:clean
main:main.o add.o sub.o
    gcc  -g add.o sub.o main.o -o main
main.o : main.c
    gcc -c -g main.c -o main.o
add.o : add.c
    gcc -c -g add.c -o add.o
sub.o : sub.c
    gcc -c -g sub.c -o sub.o

clean:
    rm -rf *.o
[root@localhost project]# make
gcc -c -g main.c -o main.o
gcc -c -g add.c -o add.o
gcc -c -g sub.c -o sub.o
gcc  -g add.o sub.o main.o -o main
[root@localhost project]# ls
add.c  add.h  add.o  main  main.c  main.o  sub.c  sub.h  sub.o  Makefile
[root@localhost project]# make clean
rm -rf *.o
[root@localhost project]# ls
add.c  add.h  main  main.c  sub.c  sub.h  Makefile 
  • 3.使用变量:
      makefile文件中的变量代表了一个字符串,类似于c语言中的宏
    变量定义规则:
       -变量一般大写
      -变量名=值1 值2 …
       -使用变量: $(变量名)
    例如:
#定义变量OBJS
OBJS=main.o  add.o  sub.o
#使用变量
$(OBJS)
  • 4.makefile文件书写的简化
$^  代表所有依赖文件
$@  代表目标文件
$<  第一个依赖文件
@指令  输出时不显示该指令

所以整个的makefile文件可简化为:

#简化前:
#main:main.o add.o sub.o
#   gcc  -g add.o sub.o main.o -o main
#main.o : main.c
#   gcc -c -g main.c -o main.o
#add.o : add.c
#   gcc -c -g add.c -o add.o
#sub.o : sub.c
#   gcc -c -g sub.c -o sub.o
##################################################
#简化后:
.PHONY:clean main
CC=gcc
OBJS=main.o  add.o  sub.o
main: $(OBJS)
    $(CC) -g $^ -o $@
clean:
    rm -rf $(OBJS)
  • 5.其他注意事项:
      1.命令前加@符号,会不显示出命令内容
      2.echo命令,可以把变量内容读出来
      3.使用其他makefile文件,命令: make -f 其他makefile文件
      

猜你喜欢

转载自blog.csdn.net/CY071512/article/details/79902034