来自阅读陈皓的《跟我一起写makefile》

  VPATH变量

    在一些大的工程中,有大量的源文件,我们通常的做法是把这许多的源文件分类,并存放在不同的目录中。所以,当 make 需要去找寻文件的依赖关系时,你可以在文件前加上路径,但最好的方法是把一个路径告诉 make,让 make 在自动去找。Makefile 文件中的特殊变量“VPATH”就是完成这个功能的,如果没有指明这个变量,make 只会在当前的目录中去找寻依赖文件和目标文件。如果定义了这个变量,那么,make就会在当当前目录找不到的情况下,到所指定的目录中去找寻文件了。

    VPATH = dir1 : dir2

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

  怎么使用呢?

  假设有以下工程,目录数为:

./
├── bardir
│   ├── bar.c
│   └── bar.h
├── command.h
├── foodir
│   ├── foo.c
│   └── foo.h
├── main.c
├── Makefile
└── README.md

  main.c中调用了bar.c foo.c中的函数,最直白的makefile

OBJS = main.o foodir/foo.o bardir/bar.o

CINCLUDES = -I./foodir -I./bardir
CFLAGS = -Wall TARGET = test $(TARGET):$(OBJS)
$(CC) $(CFLAGS) $^ -o $@ $(CINCLUDES) .PHONY:clean clean:
rm $(OBJS) $(TARGET)

  查看目录树

./
├── bardir
│   ├── bar.c
│   ├── bar.h
│   └── bar.o
├── command.h
├── foodir
│   ├── foo.c
│   ├── foo.h
│   └── foo.o
├── main.c
├── main.o
├── Makefile
├── README.md
└── test

  如果模块目录比较深,那么OBJS后面会跟一大堆,这时VPATH变量起到作用了,改进后的makefile

VPATH = ./foodir:./bardir

OBJS = foo.o bar.o main.o 

CINCLUDES = -I./foodir -I./bardir
CFLAGS = -Wall $(CINCLUDES) TARGET = test $(TARGET):$(OBJS)
    $(CC) $(CFLAGS) $^ -o $@ .PHONY:clean clean:
    @-rm -f $(TARGET) $(OBJS)

  再查看目录树:

./
├── bardir
│   ├── bar.c
│   └── bar.h
├── bar.o
├── command.h
├── foodir
│   ├── foo.c
│   └── foo.h
├── foo.o
├── main.c
├── main.o
├── Makefile
├── README.md
└── test

对比上一次可以看到子目录下生成的.o文件现在生成在Makefile这一级目录了。需要注意的是:通过VPATH告知文件搜寻路径是告知的make,这利于它隐式推导时的文件搜索,而不是告知的gcc,所以还是得通过-I指定gcc预编译时头文件搜索路径

vpath关键字

。。。

  

makefile之VPATH和vpath的使用的更多相关文章

  1. Makefile目标文件搜索(VPATH和vpath

    转载:http://c.biancheng.net/view/7051.html 我们都知道一个工程文件中的源文件有很多,并且存放的位置可能不相同(工程中的文件会被放到不同的目录下),所以按照之前的方 ...

  2. 怎么写makefile?(转)

    跟我一起写 Makefile 陈皓 第一章.概述 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和 pr ...

  3. 【转】Linux makefile 教程 非常详细,且易懂

    From: http://blog.csdn.net/liang13664759/article/details/1771246 最近在学习Linux下的C编程,买了一本叫<Linux环境下的C ...

  4. linux中Makefile文件相关内容

    第一章.概述什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional(专业)的程序员,m ...

  5. Makefile经典教程(掌握这些足够)

    makefile很重要 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员 ...

  6. Linux makefile 教程 非常详细,且易懂

    最近在学习Linux下的C编程,买了一本叫<Linux环境下的C编程指南>读到makefile就越看越迷糊,可能是我的理解能不行. 于是google到了以下这篇文章.通俗易懂.然后把它贴出 ...

  7. makefile函数

    http://www.cnblogs.com/tianyajuanke/archive/2013/02/16/2610276.html 通用步骤: 编译时,可以不知钉头文件,如果指定头文件,其作用是当 ...

  8. Makefile <网络转载>

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

  9. Makefile的学习笔记

    Makefile的学习笔记 标签: makefilewildcard扩展includeshellfile 2012-01-03 00:07 9586人阅读 评论(2) 收藏 举报  分类: Linux ...

随机推荐

  1. healthMonitoring与运行状况监视

    配置针对应用程序的运行状况监视的一个服务 配置节内容比以往的较为复杂,如下 <healthMonitoring Enabled="true|false" heartbeatI ...

  2. java-阻塞队列

    阻塞队列与普通队列的区别在于,当队列是空的时,从队列中获取元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操作会被阻塞.试图从空的阻塞队列中获取元素的线程将会被阻塞,直到其他的线程往空的队列 ...

  3. 新建 .NET Core 项目 -- Hello World!

    一.开发工具安装 1.可选模式一 (不推荐,此为Windows开发方式) 安装 Visual Studio 2015 / Visual Studio 2015 Update 3 / .NET Core ...

  4. 深入理解和应用Float属性

    一.Float的特性 1. 应用于文字围绕图片 2. 创建一个块级框 3. 多列浮动布局 4. 浮动元素的宽度.高度自适应,但可以设置其值. 二.核心解决的问题 文字围绕图片:img标签与多个文本标签 ...

  5. js正则表达式图形化工具-rline

    github地址:https://github.com/finance-sh/rline 在线demo: http://lihuazhai.com/demo/test.html 这是一个js正则表达式 ...

  6. 【模块化编程】理解requireJS-实现一个简单的模块加载器

    在前文中我们不止一次强调过模块化编程的重要性,以及其可以解决的问题: ① 解决单文件变量命名冲突问题 ② 解决前端多人协作问题 ③ 解决文件依赖问题 ④ 按需加载(这个说法其实很假了) ⑤ ..... ...

  7. JavaScript判断变量值简单的方法

    今天在看一个动态web表单设计器的时候发现项目中的 一个写法 function sum_total(v){ if (!v) { v= 0; } } !v  这是什么写法?不过可以肯定的是,这是一种判断 ...

  8. Android 缓存

    1.Android缓存机制&一个缓存框架推荐 http://blog.csdn.net/shakespeare001/article/details/51695358 2.ASimpleCac ...

  9. OOP感悟

    行内讲的最多的就是出来一年内基本靠copy,一年后才基本懂得如何去写代码,而理解领悟oop,需要的时间却不定. 我工作中,我发现很多人拿着面向对相当的语言作者做着面向过程的事情,不需要知其所以然,只要 ...

  10. iOS 疑难杂症 — — UIButton 点击卡顿/延迟

    前言 一开始还以为代码写的有问题,点击事件里面有比较耗时卡主线程的代码,逐一删减代码发现并不是这么回事. 声明  欢迎转载,但请保留文章原始出处:)  博客园:http://www.cnblogs.c ...