管理Linux环境下的C/C++大型项目,如果有一个智能的Build System会起到事半功倍的效果,本文描述Linux环境下大型工程项目子目录Makefile的一种通用写法,使用该方法,当该子目录内的文件有增删时无需对Makefile进行改动,可以说相当的智能。

下面先贴代码(为减小篇幅,一些非关键的代码被去掉,本方法的局限是用于一个C文件生成一个可执行文件的场合):

ROOTDIR = .

EXE_DIR = ./bin
CFLAGS = -I$(INCLUDE_DIR) -I$(LIB_INC) -Wall
LFLAGS = -L$(LIB_DIR)

objects := $(patsubst %.c,%.o,$(wildcard *.c))
executables := $(patsubst %.c,%,$(wildcard *.c))

all : $(objects)
$(objects) :%.o : %.c
    @mkdir -p ./bin$
    $(CROSS_COMPILE)gcc -c $(CFLAGS) $< -o $@
    $(CROSS_COMPILE)gcc $(CFLAGS) $< -o $(subst .o, ,$(EXE_DIR)/$@) $(LFLAGS) $(LIBS)
clean:
    @rm -f *.o rm -f $(executables)
    @rm -rf ./bin
distclean: clean

假如当前目录里面有a.c b.c两个文件

Makefile 里的函数跟它的变量很相似——使用的时候,你用一个$符号跟左圆括号,函数名,空格后跟一列由逗号分隔的参数,最后用右圆括号结束。例如,在GNU Make里有一个叫'wildcard' 的函数,它有一个参数,功能是展开成一列所有符合由其参数描述的文件名,文件间以空格间隔。像这个命令:
 
    objects= $(wildcard *.c)   
 
  会产生一个所有以'.c' 结尾的文件列表(本例结果为a.c b.c),然后存入变量objects里。   
 
  另一个有用的函数是 patsubst ( patten substitude,匹配替换的缩写)函数。它需要3个参数——第一个是一个需要匹配的式样,第二个表示用什么来替换它,第三个是一个需要处理由空格分隔的序列。我们将两个函数合起来用:
 
objects := $(patsubst %.c,%.o,$(wildcard *.c))
 会被处理为:
objects := a.o b.o
 同理:
executables := $(patsubst %.c,%,$(wildcard *.c))
 会被处理为:
executables := a b
 
%o:所有以“.o”结尾的目标,也就是a.o b.o
 
依赖模式“%.c”:取模式“%.o”的%,也就是foo bar,并为其加上.c后缀,即a.c,b.c

$<:表示所有依赖目标集,也就是a.c b.c
 
$@:表示目标集,也就是a.o b.o
 
命令前加@,表示在终端中不打印,如@mkdir -p ./bin
 
$(objects) : %.o: %.c
        $(CROSS_COMPILE)gcc -c $(CFLAGS) $< -o $@

即可翻译为:

a.o b.o : a.c b.c    $(CROSS_COMPILE)gcc -c $(CFLAGS) (a.c b.c) -o (a.o b.o)
 
明白了这些,这种Makefile的写法就可以完全掌握了。
 
注:当前目录直接make的两种写法见 Makefile之写demo时的通用Makefile写法 http://www.linuxidc.com/Linux/2013-05/84679.htm

Makefile之大型工程项目子目录Makefile的一种通用写法的更多相关文章

  1. 代码片段--Makefile之大型工程项目子目录Makefile的一种通用写法

    转载:http://blog.csdn.net/mo_hui123456/article/details/8929615 管理Linux环境下的C/C++大型项目,如果有一个智能的Build Syst ...

  2. Makefile之大型工程项目子目录Makefile的一种通用写法【转】

    转自:http://www.cnblogs.com/skyofbitbit/p/3680753.html 管理Linux环境下的C/C++大型项目,如果有一个智能的Build System会起到事半功 ...

  3. u-boot子目录Makefile分析

    一.概述 u-boot的子目录Makefile是整个Makefile体系的重要组成部分,决定了对应子目录的编译过程. 二.分析 以cpu/arm920t/Makefile为例进行说明 (1)首先,调用 ...

  4. make 与makefile(会不会写 makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。)

    跟我一起写 Makefile /**/ 陈皓 (CSDN) 概述 —— 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉 ...

  5. Makefile学习与进阶之Makefile.am和$$(M)的意思

    (1)makefile 中,出现$$(M) 是什么意思,发现还是看实际的Makefile长知识啊 在makefile中,会经常使用shell命令,也经常见到$var 和 $$var的情况,有什么区别呢 ...

  6. make :err Makefile.ssl is older than Makefile.org. Reconfigure the source tree (via './config' or 'perl Configure'), please.

    内核编译时出现错误 Makefile.ssl is older than Makefile.org. Reconfigure the source tree (via './config' or 'p ...

  7. Can't locate Log/Dispatch.pm in @INC /Makefile out-of-date with respect to Makefile.PL

    mha check的时候报错问题解决:   # masterha_check_ssh --conf=/data/mha/app1.cnf Can't locate Log/Dispatch.pm in ...

  8. Spark 论文篇-大型集群上的快速和通用数据处理架构(中英双语)

    论文内容: 待整理 参考文献: An Architecture for Fast and General Data Processing on Large Clusters. Matei Zahari ...

  9. project管理之makefile与自己主动创建makefile文件过程

    (风雪之隅 http://www.laruence.com/2009/11/18/1154.html) Linux Makefile自己主动编译和链接使用的环境 想知道到Linux Makefile系 ...

随机推荐

  1. 树形DP--codevs 1380 没有上司的舞会

    codevs 1380 没有上司的舞会 变式题目:给定一棵树每个点有一个点权,求一个独立集使得点权和最大,树上的独立集指的是选取树上的点,使尽量多的点不直接相连  时间限制: 1 s  空间限制: 1 ...

  2. 最短路:我的理解--Dijkstra算法

    最短路径:Dijkstra算法 用来计算从一个点到其他所有点的最短路径的算法,是一种单源最短路径算法.也就是说,只能计算起点只有一个的情况. Dijkstra的时间复杂度是O (N2),它不能处理存在 ...

  3. linux基础命令学习 (九)文本操作

    一.head 1.语法: head [选项] [文件] 2.选项 -q 隐藏文件名 -v 显示文件名 -c<字节> 显示字节数 -n<行数> 显示的行数 3.示例 范例一:查看 ...

  4. 分享我用Taker做任务时需要的各种资源的精华帖,方便查阅

    http://tieba.baidu.com/p/2310764470 第一名 [Tasker论坛] https://groups.google.com/group/tasker/?pli=1http ...

  5. WICED™ <SMART> Software Development Kit

    WICED™ Software Development Kit The WICED™ SDK includes the tools and software needed to create Wi-F ...

  6. CSS基础知识解析

    一.基础知识 1.1 CSS组成 css 样式由选择符和声明组成,而声明又由属性和值组成,如下图所示: 选择符:又称选择器,指明网页中要应用样式规则的元素,如本例中是网页中所有的段(p)的文字将变成蓝 ...

  7. JavaScript面试(-------------------------------------------)

    this是什么 方法调用模式 构造器调用模式 函数调用模式 apply/call模式 this是什么 —大多语言中,’this’代表由类实例化的当前对象.在JavaScript中,’this’通常表示 ...

  8. EntityFramework:值语义的实体如何修改?

    背景 现在很流行值对象,值对象有如下特点:开发简单.使用简单和多线程安全.我试着让 EntityFramework 中的实体保持值语义,这样的话,对值语义实体的修改就应当等于“整体替换”,好像有点问题 ...

  9. 解决HUE报错MultipleObjectsReturned: get() returned more than one Document2 -- it returned 2!

    表现:界面上报错:,刚登陆进去就能看到,点击执行也会出现.日志里报: Traceback (most recent call last): File "/home/work/hue-3.10 ...

  10. Python学习(五)函数 —— 内置函数 lambda filter map reduce

    Python 内置函数 lambda.filter.map.reduce Python 内置了一些比较特殊且实用的函数,使用这些能使你的代码简洁而易读. 下面对 Python 的 lambda.fil ...