在实际开发项目中,我们通常将一个工程划分为多个文件夹,每个文件夹代表不能的功能,如:我的一个项目cpl,它分为两个文件夹:src和test。当在cpl文件夹中运行make的时候,它的一级目录都会自动运行各自文件夹中的Makefile,cpl文件夹中的Makefile需要定义一些编译变量,如:包含的库,编译标志。这些变量需要通过export命令导出至子级Makefile文件中,如下:

CC = g++
INCLUDE = $(shell pwd)/src
CFLAGS = -I $(INCLUDE) -ggdb -Wall -Wextra -Werror --std=c++11
LIBS = -lpthread -lgtest
export

子级test文件夹makefile内容如下:

../test_graph.o:test_graph.cpp ${INCLUDE}/graph.h libgtest.a
@echo ${INCLUDE}
$(CC) -c $< -o $@ $(CFLAGS) $(LIBS)

子级src文件夹makefile内容如下:

../graph.o:graph.cpp graph.h
$(CC) -c $< -o $@ $(CFLAGS)

在上面的Makefile中,INCLUDE变量当通过{}引用为数组格式,()引用只读取第一个元素。$@为引用编译目标(target),$<引用依靠列表(dependent list)。对象文件输出至上一级文件夹,当然也可以输出至对应的目标文件夹。

整个cpl文件夹中的Makefile文件列表如下:

CC = g++
INCLUDE = $(shell pwd)/src
CFLAGS = -I $(INCLUDE) -ggdb -Wall -Wextra -Werror --std=c++11
LIBS = -lpthread -lgtest
export subdirs := $(shell find * -maxdepth 0 -type d)
objects := $(wildcard *.o) subdirs:
for dir in $(subdirs); do \
$(MAKE) -C $$dir; \
done all: main main:$(objects)
@echo ${objects}
$(CC) $(CFLAGS) ${objects} $(LIBS) -o $@ .PHONY: clean clean:
rm *.o
rm main

当输入make时,自动编译所有子目录的makefile,这样就实现了拆分编译。

Makefile拆分编写的更多相关文章

  1. 【OpenWRT】【RT5350】【三】MakeFile文件编写规则和OpenWRT驱动开发步骤

    一.Makefile文件编写 http://www.cnblogs.com/majiangjiang/articles/3218002.html 可以看下上面的博客,总结的比较全了,在此不再复述 二. ...

  2. Linux Makefile文件编写详细步骤与实践

    Linux Makefile文件编写详细步骤与实践 1.makefile概述 Windows环境下IDE会帮你完成makefile文件的编写,但在UNIX环境下你就必须自己写makefile了,会不会 ...

  3. C、C++的Makefile的编写以及动、静态库的制作调用(包括MAC地址的获取及MD5加密)

    一.C代码 静态库 四个.h.c文件 add.h #ifndef ADD_H #define ADD_H int add(int a,int b); #endif add.c #include < ...

  4. makefile的编写规则

    2.       编写makefile 示例: test:main.o func.o gcc -o test main.o func.o func.o:func.c gcc -c func.c mai ...

  5. 一个简单的makefile文件编写

    下午闲来无聊,就打开很久没动过的linux系统想熟悉熟悉在linux上面编译代码,结果一个makefile文件搞到晚上才搞定,哈哈! 先把代码简单贴上来,就写了一个冒泡排序: sort.h: #ifn ...

  6. Android系统开发(3)——Makefile的编写

    Makefile是什么? makefile的作用: 1.project文件组织,编译成复杂的程序 2.安装及卸载我们的程序 Makefile使用演示样例 在/home/username/makefil ...

  7. 一个通用Makefile的编写

    作者:杨老师,华清远见嵌入式学院讲师. 我们在Linux环境下开发程序,少不了要自己编写Makefile,一个稍微大一些的工程下面都会包含很多.c的源文件.如果我们用gcc去一个一个编译每一个源文件的 ...

  8. Makefile简单编写实例

    介绍一下Makefile的简单编写例子. 编写Makefile的规则就是: 目标文件:依赖文件 (tab)编译规则 现在我有一个文件目录结构为: 解释一下这几个文件.首先我创建makefile目录,底 ...

  9. 转:SYNOPSYS VCS Makefile文件编写与研究

    SYNOPSYS VCS Makefile文件编写与研究 这个Makefile是synopsys提供的模板,看上去非常好用,你只要按部就班提供实际项目的参数就可以了.我们来看这个文件的头部说明:mak ...

随机推荐

  1. charles抓包工具

    HTTP抓包 打开Charles程序 查看Mac电脑的IP地址,如192.168.1.7 打开iOS设置,进入当前wifi连接,设置HTTP代理Group,将服务器填为上一步中获得的IP,即192.1 ...

  2. ssi项目(1)环境搭建

    1.环境准备 导包(jdk1.8只支持spring4.0以上的版本) mysql驱动包 c3p0驱动包 mybatis包 spring-core.spring-aop.spring-web.sprin ...

  3. POJ 3294 二分找超过一半字符串中存在的子串

    题目大意: 给定n个字符串,求出现在不小于k/2个字符串中的最长子串. 二分找对应子串长度的答案,将所有字符串链接成一个长字符串求后缀数组,记录每一个位置本属于第几个字符串,利用height查询的时候 ...

  4. jdbc链接mysql插入数据后显示问号

    1.在cmd中进入mysql查看默认的编码格式:mysql> show variables like "%char%"; 若不是utf8(因为我用的是utf8),关掉mysq ...

  5. hibernate的1+n

    对数据库访问还是必须考虑性能问题的, 在设定了1 对多这种关系之后, 查询就会出现传说中的n +1 问题. 1 )1 对多,在1 方,查找得到了n 个对象, 那么又需要将n 个对象关联的集合取出,于是 ...

  6. Qt中sizeof

    class a{ int d; // virtual void ssss(); }; qDebug() <<sizeof(a) << sizeof(int) << ...

  7. CLR线程池

    WaitCallback 表示要在 ThreadPool 线程上执行的回调方法. 创建委托,方法是将回调方法传递给 WaitCallback 构造函数. 您的方法必须具有此处所显示的签名. 如果想使用 ...

  8. 利用SegmentedControl切换控制器的view

    #import "ViewController.h" #import "OneViewController.h" #import "TwoViewCo ...

  9. C#的New关键字的几种用法

    一.在C#中,new这个关键字使用频率非常高,主要有3个功能: a)     作为运算符用来创建一个对象和调用构造函数. b)     作为修饰符. c)      用于在泛型声明中约束可能用作类型参 ...

  10. javascript实现当前页面截屏

    javascript实现当前页面截屏 一.前言 有客户要求能对用户当前页面进行指定区域截屏,类似qq截屏的实现效果.比如用户在处理工作的时候,将当前页面录入后的一些信息进行截图下载保存.但又不能安装任 ...