本文,主要总结一下小项目中的一种实用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 plaincopy
  1. # compile macro
  2. CC      = g++
  3. CFLAGS  = -Wall
  4. LDFLAGS = -lm
  5. INCLUDES= -I/usr/local/include
  6. # user modify: target and objects
  7. EXENAME = test
  8. OBJECTS = x.o y.o z.o
  9. # make target
  10. all:${OBJECTS}
  11. ${CC} -o ${EXENAME} *.o ${LDFLAGS} ${INCLUDES}
  12. # make clean
  13. clean:
  14. rm -rf ${EXENAME} ${OBJECTS}
  15. # dependence
  16. %.o : %.cpp
  17. ${CC} ${CFLAGS} ${INCLUDES} -c $< -o $@
  18. %.o : %.cc
  19. ${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 plaincopy
  1. # compile macro
  2. CC      = g++
  3. CFLAGS  = -Wall
  4. LDFLAGS = -lm
  5. INCLUDES= -I/usr/local/include
  6. # user modify: subdir, target and objects
  7. VPATH   = subdir1 subdir2
  8. EXENAME = test
  9. OBJECTS = x.o y.o z.o
  10. # make target
  11. all:${OBJECTS}
  12. ${CC} -o ${EXENAME} *.o ${LDFLAGS} ${INCLUDES}
  13. # make clean
  14. clean:
  15. rm -rf ${EXENAME} ${OBJECTS}
  16. # dependence
  17. %.o : %.cpp
  18. ${CC} ${CFLAGS} ${INCLUDES} -c $< -o $@
  19. %.o : %.cc
  20. ${CC} ${CFLAGS} ${INCLUDES} -c $< -o $@

该makefile的几个说明:
        1)不同目录源码的目标文件,都在OBJECTS中指定;VPATH指定目录。
        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/

makefile多目录多文件相关推荐

  1. 1222_SCons单目录多文件的编译实现

    全部学习汇总: GitHub - GreyZhang/g_SCons: A new member in my toolbox, looking forward to replacing make to ...

  2. JAVA CP936编码转utf8_对一个目录的文件从cp936转换成utf-8

    打开一个文件,确认能够无乱码打开 [xw@localhost work]$ vi NPOSP/src/sjl05.cpp 但是,这里打开的方式是以cp936的编码方式打开的. 编码的选择,记录在~/. ...

  3. Python监控目录文件夹,并使用SFTP上传目录及文件到linux服务器

    Python 扫描监控本地文件夹并进行超大文件上传 方案1:WebUploader大文件分块多线程并发上传 方案2:watchdog目录文件夹监控,paramiko STFP上传服务器 方案3:优化2 ...

  4. Linux中/proc目录下文件详解

    Linux中/proc目录下文件详解(一) 声明:可以自由转载本文,但请务必保留本文的完整性. 作者:张子坚 email:zhangzijian@163.com 说明:本文所涉及示例均在fedora ...

  5. 【FFmpeg】FFmpeg中操作目录、文件的接口

    1.简述 在学习FFmpeg源码中的例子时,发现FFmpeg封装了操作目录和文件的接口.这篇博客把这些接口罗列出来,作为笔记简单记录下. 2.接口列表 打开目录,准备读取目录信息 int avio_o ...

  6. R语言dir函数获取目录中文件或者文件夹名称实战

    R语言dir函数获取目录中文件或者文件夹名称实战 目录 R语言dir函数获取目录中文件或者文件夹名称实战 #基本语法

  7. linux 检查权限,检查目录下 文件的权限-linux shell脚本,

    检查目录下 文件的权限-linux shell脚本, #!/bin/bash #History: #2019/07/23    Fsq #This Program will check Permiss ...

  8. python实现文件搜索_python实现搜索指定目录下文件及文件内搜索指定关键词的方法...

    本文实例讲述了python实现搜索指定目录下文件及文件内搜索指定关键词的方法.分享给大家供大家参考.具体实现方法如下: #!/usr/bin/python -O # -*- coding: UTF-8 ...

  9. os.walk(path)遍历path下的所有目录和文件

    设有如下目录(红色)和文件(黑色)树状结构,我当前的python代码在me的位置. 任务:遍历file这个目录下的所有目录和文件,打印名称. import os for parent,dirnames ...

最新文章

  1. emWin GUIBuilder V5.40a 无法保存文件问题解决方案
  2. float python_Python中float('INF')的使用
  3. 内存双通道不兼容举例以及解决方案.
  4. 蓝桥杯 数字三角形 贪心+动态规划
  5. scala java混合_Scala特性混合
  6. 用Notepad++写python的小配置
  7. 17. GD32F103C8T6入门教程-adc 使用教程2-dma+连续扫描方式采集数据++dma中断通知
  8. Sql Update Alter Rename
  9. 电脑W7系统怎样安装鸿蒙系统,家用电脑升级win7系统的操作方法
  10. Java短视频直播APP源码
  11. 神州数码招聘软件测试,神州数码面试经验
  12. flash读取程序 msp430_MSP430 flash的操作
  13. ”小糊涂“:数学考试之友
  14. EEG实验中Matlab打标方法及遇见问题
  15. bfs+状压——朋也与光玉
  16. APMServ 使用
  17. 桃词典 Peach Dictionary 简易英语词典app开发 安卓软件开发 Part 6
  18. laravel 邮件发送
  19. SA的恶魔:态势感知的敌人
  20. 【伊家田园带你了解行业观点】赵春江院士:智慧农业技术让“会”种地升级为“慧”种地

热门文章

  1. linux 编程之库的使用(学习笔记)
  2. 点在平面上的投影坐标例题_光测力学-栅线投影(面结构光)技术
  3. 百度面试题:生产者 消费者问题
  4. win10找不到局域网Linux,技术员解惑win10系统访问不了NAS和linux网络共享的详细办法...
  5. java 如何让HashMap变成线程安全的
  6. java 类和方法自动添加注释
  7. matlab相关的数字信号,数字信号处理及其MATLAB实现.ppt
  8. mac os x java_Mac OS X和多个Java版本
  9. 完善的仿京东电商开源项目
  10. 儿童版「微信」要来了?