小项目实用makefile

本文,主要总结一下小项目中的一种实用makefile写法,为个人项目或小型项目makefile提供参考。
        
        1. 单个源码文件的makefile
        常规的教程,或网上资料,都会以单个源码文件的makefile为示例,讲解makefile的最基本用法。它的用处,除了知道一下all、clean外,无它。
        makefile,主要用于管理实用项目中,较复杂结构的源码编译过程,一般用于c、c++。如果只有一个源码文件,不用makefile,直接gcc/g++更好。有时候,源码要链接特殊的库或包含特殊路径头文件,为了避免忘记,可以使用makefile(另一个建议,是写一个shell脚本,记录gcc/g++的命令)。一个例外是,现在只有一个文件,但后续会扩展成多个文件,应该使用makefile。
        
        2. 一个目录、多个源码文件的makefile
        一个实用的程序,常规包含多个源码文件,此时makefile能派上用场。一个实用makefile如下所示(注意,makefile中,目标的执行语句只能使用tab起始,不能以空格。如all、clean的下一行): 

[plain]  view plain copy
  1. # compile macro  
  2. CC      = g++  
  3. CFLAGS  = -Wall  
  4. LDFLAGS = -lm  
  5. INCLUDES= -I/usr/local/include  
  6.   
  7. # user modify: target and objects  
  8. EXENAME = test  
  9. OBJECTS = x.o y.o z.o  
  10.   
  11. # make target  
  12. all:${OBJECTS}  
  13.     ${CC} -o ${EXENAME} *.o ${LDFLAGS} ${INCLUDES}  
  14.       
  15. # make clean  
  16. clean:  
  17.     rm -rf ${EXENAME} ${OBJECTS}   
  18.   
  19. # dependence      
  20. %.o : %.cpp  
  21.     ${CC} ${CFLAGS} ${INCLUDES} -c $< -o $@  
  22. %.o : %.c  
  23.     ${CC} ${CFLAGS} ${INCLUDES} -c $< -o $@  

         该makefile的几个说明:
        1)根据项目配置好以下变量:编译器CC,编译选项CFLAGS,链接库LDFLAGS,特殊包含头文件INCLUDES,可执行程序名EXENAME,源码的目标文件OBJECTS。
        2)后续用户新增一个源码文件,只需在OBJECTS中,增加一个对应文件名的目标文件即可搞定(如z.cpp, 增加z.o)。
        3)dependence中,使用了特殊变量的"%","$<","$@",保证了对应源码文件,能够生成匹配的.o文件。

        
        3. 多个目录、多个源码文件的makefile
        实用项目中,多采用分层次目录存放源码。只需在上述makefile中,增加变量VPATH指定子目录,就能搞定。makefile如下所示: 

[plain]  view plain copy
  1. # compile macro  
  2. CC      = g++  
  3. CFLAGS  = -Wall  
  4. LDFLAGS = -lm  
  5. INCLUDES= -I/usr/local/include  
  6.   
  7. # user modify: subdir, target and objects  
  8. VPATH   = subdir1 subdir2  
  9. EXENAME = test  
  10. OBJECTS = x.o y.o z.o  
  11.   
  12. # make target  
  13. all:${OBJECTS}  
  14.     ${CC} -o ${EXENAME} *.o ${LDFLAGS} ${INCLUDES}  
  15.       
  16. # make clean  
  17. clean:  
  18.     rm -rf ${EXENAME} ${OBJECTS}   
  19.   
  20. # dependence      
  21. %.o : %.cpp  
  22.     ${CC} ${CFLAGS} ${INCLUDES} -c $< -o $@  
  23. %.o : %.c 
  24.     ${CC} ${CFLAGS} ${INCLUDES} -c $< -o $@  

        该makefile的几个说明:
        1)不同目录源码的目标文件,都在OBJECTS中指定;VPATH指定目录。

在一些大的工程中,有大量的源文件,我们通常的做法是把这许多的源文件分类,并存放在不同的目录中。所以,当make需要去找寻文件的依赖关系时,你可以在文件前加上路径,但最好的方法是把一个路径告诉make,让make在自动去找。

Makefile文件中的特殊变量“VPATH”就是完成这个功能的,如果没有指明这个变量,make只会在当前的目录中去找寻依赖文件和目标文件。如果定义了这个变量,那么,make就会在当当前目录找不到的情况下,到所指定的目录中去找寻文件了。

VPATH = src:../headers

上面的的定义指定两个目录,“src”和“../headers”,make会按照这个顺序进行搜索。目录由“冒号”分隔。(当然,当前目录永远是最高优先搜索的地方)

        2)如果多个目录中,有相同名字的源文件,将按照VPATH的路径先后顺序,只编译第1个。必须调整为不冲突的文件名。(切记)
        3)所有.o文件,都生成到和makefile同一层次的目录中。
        4)项目只有一个makefile,所有目录源码文件的增加删除,都要修改该makefile。(所以推荐在小项目中使用

        
        4. 多个目录拥有独立的makefile
        大中型的实用项目中,多人协作开发,除了分层次目录存放源码,还要考虑源码权限。使用上述的1个makefile,实用性、扩展性,都不能胜任。要使用makefile树管理,每个目录拥有自己的makefile,管控该目录下的编译。
        makefile树内容比较多,将在另一篇文章“项目实用makefile”中说明。

        
        参考资料:
        1. GNU Make Manual:http://www.gnu.org/software/make/manual/


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值