C编译:makefile基础

  
     

教大家一个   makefile基础教学

        

在编译一个大型项目的时候,往往有很多目标文件,库文件,头文件以及最终的可执行文件。不同的文件之间存在依赖关系(依赖性)。比如当我们使用下面命令编译时:   
  
美元gcc - c - o测试。o test.c   
  
gcc - o helloworld test.o美元   
  
可执行文件helloworld依赖于test.o进行编译的,而test.o依赖于test.c。   
  
,依赖关系   
  
在我们编译一个大型项目时,我们往往要很多次的调用编译器,来根据依赖关系,逐步编译整个项目。这样的方式是自下而上的,即先编译下游文件,再编译上游文件。   
  
,   
  
UNIX系统下的制造工具用于自动记录和处理文件之间的依赖关系。我们不用输入大量的“gcc"命令,而只需调用使就可以完成整个编译过程。所有的依赖关系都记录在makefile文本文件中。我们只需要让helloworld,让会根据依赖关系,自上而下的找到编译该文件所需的所有依赖关系,最后再自下而上的编译。   
  
(使有多个版本,本文将基于GNU make.make会自动搜索当前目录下的makefile, makefile或者GNUmakefile)   
  
,   
  
依赖   
  
,   
基本概念   
  
我们使用一个示例C语言文件:   
复制代码   
  
# include & lt; stdio.h>   
  
/*   
,由Vamei *   
, *测试。c makefile演示   
*/
int main ()   
{   
,,,printf (“Hello world ! \ n");   
,,,返回0;   
}   
  
复制代码   
  
,   
  
下面是一个简单的makefile   
复制代码   
  
# helloworld是一个二进制文件   
helloworld: test.o   
回声“好;   
gcc - o helloworld test.o   
  
测试。o: test.c   
gcc - c - o测试。o test.c   
  
复制代码   
  
,   
  
观察上面的makefile   
  
,,,#号起始的行是注释行   
,,,目标:前提为依赖关系,即目标文件(目标)依赖于前提文件(前提)。可以有多个前提文件,用空格分开。   
,,,依赖关系后面的& lt; Tab>缩进行是实现依赖关系进行的操作,即正常的UNIX命令。一个依赖关系可以附属有多个操作。   
  
用直白的话说,就是:   
  
,,,想要helloworld吗?那你必须有test.o,并执行附属的操作。   
,,,如果没有test.o,那你必须搜索其他依赖关系,并创建test.o。   
  
,   
  
我们执行   
  
美元helloworld   
  
来创建helloworld。   
  
,   
  
让是一个递归创建的过程:   
  
,,,基本情况1:如果当前依赖关系中没有说明前提文件,那么直接执行操作。   
,,,基本情况2:如果当前依赖关系说明了目标文件,而目标文件所需的前提文件已经存在,而且前提文件与上次做时没有发生改变(根据最近写入时间判断),也直接执行该依赖关系的操作。   
,,,如果当前目标文件依赖关系所需的前提文件不存在,或者前提文件发生改变,那么以前提文件为新的目标文件,寻找依赖关系,创建目标文件。   
  
虚线:依赖关系检索   
  
,   
  
上面是让的核心功能。有了上面的功能,我们可以记录项目中所有的依赖关系和相关操作,并使用让进行编译。下面的内容都是在此核心内容上的拓展。   
  
,   
宏   
  
制作中可以使用宏(宏观)。宏类似于文本类型的变量。比如下面的CC:   
复制代码   
  
CC=gcc   
  
# helloworld是一个二进制文件   
helloworld: test.o   
回声“好;   
(CC) - o helloworld test.o美元   
  
测试。o: test.c   
$ (CC) - c - o测试。o test.c   
  
复制代码   
  
,   
  
我们用CC来代表“gcc"在makefile中,使用美元(CC)的方式来调用宏的值使会在运行时,使用宏的值(gcc)来替代美元(CC)。   
  
壳的环境变量可以直接作为宏调用。如果同一个自定义的宏同时也有同名环境环境变量,使将优先使用自定义宏。   

C编译:makefile基础