Linux项目自动化构建工具——make/Makefile

1.背景

    · 会不会写Makefile,从侧面说明了一个人是否具备完成大型工程的能力。

    · 一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,Makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至进行更复杂的功能操作。

    · Makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程就完全自动编译,极大地提高了软件开发的效率。

    · make是一个命令工具,是一个解释Makefile中指令的命令工具。

    · make是一条命令,Makefile是一个文件,两个搭配使用,完成项目自动化构建。

例:hello.c

    #include <stdio.h>
    
    int main()
    {
        printf("hello Makefile!\n");
        return 0;
    }



2.原理

    make是如何工作的,在默认的方式下,也就是只输入make命令,则:

1)make会在当前目录下找名字叫Makefile的文件

2)如果找到,它会找文件中第一个目标文件,在上述例子中,它会找到hello这个文件,并将其作为最终的目标文件

3)如果hello文件不存在,或是hello所依赖的后面的hello.o文件的修改时间要比hello这个文件新,那么,它就会执行后面所定义的命令来生成hello这个文件

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

5)当然,你的C文件和H文件是存在的,于是make会生成hello.o文件,然后再用hello.o文件声明make的终极任务,也就是执行文件hello

6)这就是整个make的依赖性,make会一层又一层的去找文件的依赖关系,直到最终编译出第一个目标文件

7)在寻找的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出并报错,而对于所定义的命令的错误,或是编译不成功,或是make根本不理会

8)make只管文件的依赖性,即:如果在找了依赖关系后,毛好后面的文件还是不存在,那么它就不工作了

9)工程是要被清理的

10)像clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令不会被自动执行,不过,我们可以显示要make执行,即命令:make clean,以此来清除所有目标文件,以便重新编译

11)一般我们要clean的目标文件,我们将它设置为伪目标,用.PHONY修饰,伪目标的特性是总是被执行的

猜你喜欢

转载自blog.csdn.net/tangduobutian/article/details/80240267