Makefile学习

Makefile 介绍
首先,我们用一个示例来说明Makefile的书写规则。以便给大家一个感兴认识。我们的规则是:
1)如果这个工程没有编译过,那么我们的所有C文件都要编译并被链接。
2)如果这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并链接目标程序。
3)如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C文件,并链接目标程序。

只要我们的Makefile写得够好,所有的这一切,我们只用一个make命令就可以完成,make命令会自动智能地根据当前的文件修改的情况来确定哪些文件需要重编译,从而自己编译所需要的文件和链接目标程序。

这是Makefile文件:

[plain]  view plain copy
  1. main:main.o mytool1.o mytool2.o   
  2.        gcc -o main main.o mytool1.o mytool2.o   
  3. main.o:main.c mytool1.h mytool2.h   
  4.        gcc -c main.c   
  5. mytool1.o:mytool1.c mytool1.h   
  6.        gcc -c mytool1.c   
  7. mytool2.o:mytool2.c mytool2.h   
  8.        gcc -c mytool2.c  
  9. clean:       
  10.        rm -rf *.o main  

在Makefile中#开始的行都是注释行。Makefile中最重要的是描述文件的依赖关系的说明。

一般的格式是:  

target:components  

TAB rule

第一行表示的是依赖关系。第二行是规则。

例如上面的那个Makefile文件的前两行。

main:main.o mytool1.o mytool2.o  

表示我们的目标(target)main的依赖对象(components)是main.o mytool1.omytool2.o。 当倚赖的对象在目标修改后修改的话,就要去执行规则一行所指定的命令。就象我们的上面那个Makefile第二行所说的一样要执行 gcc-o main main.o mytool1.o mytool2.o 注意规则一行中的TAB表示那里是一个TAB键。    

    如果要删除执行文件和所有的中间目标文件,那么,只要简单地执行一下“make clean”就可以了。

Makefile有三个非常有用的变量。分别是$@,$^,$<代表的意

义分别是:  

$@       目标文件   

 $^         所有的依赖文件  

 $<        第一个依赖文件  如果我们

使用上面三个变量,那么我们可以简化我们的Makefile文件为:# 简化后的Makefile 

[html]  view plain copy
  1. main:main.o mytool1.o mytool2.o  
  2.   gcc -o $@ $^  
  3. main.o:main.c mytool1.h mytool2.h  
  4.   gcc -c $<  
  5. mytool1.o:mytool1.c mytool1.h  
  6.   gcc -c $<  
  7. mytool2.o:mytool2.c mytool2.h  
  8. clean:  
  9.        rm -rf *.o main  

   gcc -c $<经过简化后,我们的Makefile是简单了一点,不过人们有时候还想简单一点。

这里我们学习一个Makefile的缺省规则 

    .c.o: 

 gcc -c $<

这个规则表示所有的 .o文件都是依赖与相应的.c文件的。例如mytool.o依赖于mytool.c,这样Makefile还可以变为:

[plain]  view plain copy
  1. # 这是再一次简化后的Makefile  
  2.   
  3. main:main.o mytool1.o mytool2.o  
  4.   gcc -o $@ $^  
  5. .c.o:  
  6.   gcc -c $<  
  7. clean:  
  8.       rm -rf *.o main  


好了,我们的Makefile 也差不多了,如果想知道更多的关于Makefile的规则,可以查看相应的文档。

最后,总结下make 执行过程  

    1)make 在当前目录下找 "Makefile"或"makefile"的文件

    2)如果找到,则会找文件中第一个目标文件(target)。如上例子中main      

    3)如果 main 命令的执行,依赖后面命令执行所产生的文件,则先执行后面命令    

    4)当main 命令需要的文件生成完毕,则执行main 命令  


来自:http://blog.csdn.net/koches/article/details/7609361

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值