【Linux】 自动化构建工具-make/Makefile

        一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile就像一个shell脚本一样,其中也可以执行操作系统的命令。Makefile 文件描述了整个工程的编译、连接等规则。其中包括:工程中的哪些源文件需要编译以及如何编译、需要创建那些库文件以及如何创建这些库文件、如何最后产生我们想要的可执行文件。尽管看起来可能是很复杂的事情,但是为工程编写Makefile 的好处是能够使用一行命令来完成“自动化编译”,一旦提供一个(通常对于一个工程来说会是多个)正确的 Makefile。编译整个工程你所要做的唯一的一件事就是在shell 提示符下输入make命令。整个工程完全自动编译,极大提高了效率。

对Makefile的理解:依赖关系和依赖方法,下面给出例子,创建一个简单的Makefile文件:
makefile的规则:
    目标(target):目标文件1 目标文件2
     <Tab>gcc -o 欲建立的执行文件 目标文件1 目标文件2
  目标(target)就是我们想要建立的信息,而目标文件就是具有相关性的 object files ,建立执行文件的语法就是以 <tab> 按键开头的那一行!特别留意,『 命令行必须要以 tab 按键作为开 头』才行!它的规则基本上是这样的:
  •在 makefile 当中的 # 代表批注;
  •<tab> 需要在命令行 (例如 gcc 这个编译程序指令) 的第一个字符;
  •标的 (target) 与相依档案(就是目标文件)之间需以『 :』隔开。

这是一个简单的Makefile文件,其中注意的是使用了Makefile的常用变量:

$^      代表所有的依赖文件

$<      代表第一个依赖文件

$@      代表目标

%.格式 代表所有该格式的文件

下面给出其它的文件:test.h    test.c   main.c




        使用make指令:make是一个命令工具,它解释Makefile 中的指令(应该说是规则)。在Makefile文件中描述了整个工程所有文件的编译顺序、编译规则。Makefile 有自己的书写格式、关键字、函数。像C 语言有自己的格式、关键字和函数一样。而且在Makefile 中可以使用系统shell所提供的任何命令来完成想要的工作。Makefile(在其它的系统上可能是另外的文件名)在绝大多数的IDE 开发环境中都在使用,已经成为一种工程的编译方法。

make的工作原理:

1. make会在当前目录下找名字为makefile或Makefile的文件。 

2. 如果找到,他会找文件中第一个目标文件,并把这个文件作为最终的目标。 

3. 如果hello文件不存在,或是hello所依赖的后面的hello.o文件的文件修改时间要比hello这个文件。 

4. 如果hello所依赖hello.o文件不存在,那么make会在当前文件中找目标为hello.o文件的依赖性,如果找到则在根据那一个生成hello.o文件,以此类推。 

5. make会一层一层的去找文件的依赖关系,直到最终编译出第一个目标文件,如果出现错误,或者没找到,make会退出并报错 。

6. 像clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令不会自动执行,需要“make clean”以清除所有的目标文件,一般这种clean的目标文件,我们将它设置为伪目标,用.PHONY修饰,它的特点是总是被执行的。


猜你喜欢

转载自blog.csdn.net/yaotengjian/article/details/79826313