Liunx之编译脚本Makefile介绍

前言

在 Liunx 平台下,我们更注重编译器对项目的编译过程,因为在 Windows 平台下有大量的 IDE 供我们使用,以至于大量的程序猿不知道自己写的代码是怎么在我们的物理机上运行。

如果你对你的代码是如何在物理机上运行的,那么你大可跳转到 Liunx 之 C/C++ 编译流程解析

该文章只记录 Makefile 的基本格式,和基本语法,如果这使你觉得乏味,那么你或许对以下内容有兴趣:

提醒

大可不必强迫自己去做一些伤元气的事,或者写一些伤元气的代码。一切为了部落,呼哈 ~~

目录
Makefile 之介绍
* 警告: 
      li > 在Makefile中的命令,必须要以[Tab]键开始!!!
  • 书写格式:
    li > Makefile
    li > makefile

  • 定义:
    li > 告诉 make 维护一个大型程序,该做什么。Makefile 说明了组成程序的各模块间的相互关系及更新模块时必须进行的动作,make 按照这些说明自动地维护这些模块。

    li > Makefile是一个文本形式的数据库文件,其中包含一些规则来告诉make处理哪些文件以及如何处理这些文件。这些规则主要是描述哪些文件(称为target目标文
         件,不要和编译时产生的目标文件相混淆)是从哪些别的文件(称为dependency依赖文件)中产生的,以及用什么命令(command)来执行这个过程。
    
  • Makefile 的组成:
    li > 显式规则,显式规则说明了如何生成一个或多个目标文件。这是由 Makefile 的书写者明显指出,要生成的文件,文件的依赖文件,生成的命令。

    li > 隐式规则,由于make有自动推导的功能,所以隐式规则可以让我们比较粗糙地简略地书写Makefile,这是由make支持的。
    
    li > 变量定义,在Makefile中我们要定义一系列的变量,变量一般都是字符串,这个有点你C语言中的宏,当Makefile被执行时,其中的变量都会被扩展到相应的引用
         位置上。
    
    li &gt; 文件指示,其包括了三个部分,一个是在一个Makefile中引用另一个Makefile,就像C语言中的<span class="hljs-keyword">include</span>一样;另一个是指根据某些情况指定Makefile中的有效部
         分,就像C语言中的预编译<span class="hljs-comment">#if一样。</span>
    
    li &gt; 注释,和UNIX的Shell脚本一样Makefile中只有行注释, 其注释是用 '<span class="hljs-comment">#' 字符,这个就像C/C++中的 '//' 或者 '/*'。</span>
    
  • Makefile 使用方法:
    li > make,执行 make 命令时,会对磁盘上的文件进行检查,如果目标文件的生成或被改动时的时间至少比它的一个依赖文件还旧的话,make 就执行相应的命令,以更新
    目标文件。目标文件不一定是最后的可执行文件,可以是任何一个中间文件并可以作为其他目标文件的依赖文件。

  • Makefile 使用方法扩展: 可以自定义伪命令,如 install、clean、debug、relese 等
    li > make install
    li > make clean
    li > make debug
    li > make relese

Makefile 之基本规则
/*
li > 一个目标(target),即 make 最终需要创建的文件,如可执行文件和目标文件;目标也可以是要执行的动作,如 'clean'

li > 一个或多个依赖文件(dependency)列表,通常是编译目标文件所需要的其他文件

li > 一系列命今 (command),是 make 执行的动作,通常是把指定的相关文件编译成目标文件的编译命令,每个命令占一行,且每个命令行的起始字符必须为 TAB 字符

以下例子诠释了以上内容

目标 : 依赖文件

命令

target: main.o
gcc -o target main.o

main.o: main.c
gcc -c main.c -o main.o

clean:
rm -rf *.o target

*/