makefile之VPATH和vpath的使用
来自阅读陈皓的《跟我一起写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的使用的更多相关文章
- Makefile目标文件搜索(VPATH和vpath
转载:http://c.biancheng.net/view/7051.html 我们都知道一个工程文件中的源文件有很多,并且存放的位置可能不相同(工程中的文件会被放到不同的目录下),所以按照之前的方 ...
- 怎么写makefile?(转)
跟我一起写 Makefile 陈皓 第一章.概述 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和 pr ...
- 【转】Linux makefile 教程 非常详细,且易懂
From: http://blog.csdn.net/liang13664759/article/details/1771246 最近在学习Linux下的C编程,买了一本叫<Linux环境下的C ...
- linux中Makefile文件相关内容
第一章.概述什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional(专业)的程序员,m ...
- Makefile经典教程(掌握这些足够)
makefile很重要 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员 ...
- Linux makefile 教程 非常详细,且易懂
最近在学习Linux下的C编程,买了一本叫<Linux环境下的C编程指南>读到makefile就越看越迷糊,可能是我的理解能不行. 于是google到了以下这篇文章.通俗易懂.然后把它贴出 ...
- makefile函数
http://www.cnblogs.com/tianyajuanke/archive/2013/02/16/2610276.html 通用步骤: 编译时,可以不知钉头文件,如果指定头文件,其作用是当 ...
- Makefile <网络转载>
陈皓 (CSDN)概述——什 么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和 professional的 ...
- Makefile的学习笔记
Makefile的学习笔记 标签: makefilewildcard扩展includeshellfile 2012-01-03 00:07 9586人阅读 评论(2) 收藏 举报 分类: Linux ...
随机推荐
- 设置WPF输入框焦点
在WPF中设置控件键盘焦点 Keyboard.Focus(/*控件名称*/);
- [WCF编程]11.错误:错误类型
一.错误概述 不管是哪一种操作,在任意时刻都可能出现不可预期的错误.问题在于我们应该如何将错误报告给客户端.异常和异常处理机制是与特定技术紧密结合的,不能跨越边界的.此外,如果有客户端来处理错误,必定 ...
- EntityFrame Work 6 Code First 配置字段为varchar 类型
EntityFrame Work 6 配置字符串属性是否支持Unicode 内容 默认情况下,字符串为Unicode(SQLServer 中的nvarchar).您可以使用IsUnicode 方法指定 ...
- Linux解决乱码问题
主要的关注点是本身文件的编码和Linux的编码是否相同, 如果不相同的话,那么修改 例如: 就OK了,如果还是有问题的话,那么就查看一下连接工具的编码是否设置的有问题. 一般情况下,主要注意这些问题, ...
- [moka同学笔记]五、Yii2.0课程笔记(魏曦老师教程)[审核功能]
- Socket编程——客户端,服务器端的读写操作
URL网络编程,最大的特征就是一对一的响应! 1:客户端“写”,服务器端用于“读” package coreBookSocket2; import java.io.InputStreamReader; ...
- 8、ASP.NET MVC入门到精通——View(视图)
本系列目录:ASP.NET MVC4入门到精通系列目录汇总 View视图职责是向用户提供界面.负责根据提供的模型数据,生成准备提供给用户的格式界面. 支持多种视图引擎(Razor和ASPX视图引擎是官 ...
- 公司内部的一篇关于dom方法的分享
第一部分 dom node类型 nodeType 属性 nodeType 属性返回节点的类型.nodeType 是只读的. 比较重要的节点类型有: 元素类型 NodeType 元素 1 属性 2 文本 ...
- 移动AD的计算机到对应的OU的powershell脚本
#//************************************************************* #//编辑人: #//编辑单位: #//编辑作用:移动计算机到对应的O ...
- 关于在SharePoint 2013(2010)中Javascript如何实现批量批准的自定义操作功能?
1.概述: SharePoint 2013(包括SharePoint 2010)提供了很方便的,多选的界面,但是很多操作还是不能批量进行,比如:批准的功能.如果您要解决方案不关心代码,那么请直接联系作 ...