Makefile目标,伪目标,头文件自动依赖
目标
即我们最终要生成的文件,make默认生成第一个目标,注意 makefile中tab和空格不是一回事,规则使用tab缩进,编辑器不要设置诸如“将tab替换为空格之类的选项”,目标的结构如下
目标:依赖1 依赖2
<TAB>生成目标的规则
伪目标
无论如何也要执行的目标,需要使用.PHONY:标识
.PHONY:clean
clean:
rm -f *.o
常见伪目标
all 是所有目标的伪目标,功能是编译所有目标
clean 删除所有被make创建的文件
install 安装已经编译好的程序,其实就是把目标执行文件拷贝到指定目标中
print 这个伪目标的功能是列出改变过的源文件
tar 把源程序打包备份,就是一个tar文件
dist 创建一个压缩文件,一般吧tar文件压缩成Z文件或gz文件
TAGS 更新所有目标,以备完整的重编译使用
check/test 测试makefile流程
例子
circle:main.o circle.o
cc main.o circle.o -o circle
main.o:main.c
cc -c main.c
circle.o :circle.c
cc -c circle.c
clean:
rm *.o *.h circle
自动依赖头文件
makefile是根据依赖关系,时间戳和生成规则来判断哪些文件需要更新,但是我们通常写的生成规则并不会包含头文件,依赖关系也不会,这样如果我们更新了头文件,makefile也不会发现,也就不会更新相应的文件,同时,考虑到头文件包含关系的复杂性,我们在写依赖关系之前把所有的头文件理清楚再写进去也不现实,一个好的方式是利用$gcc -M或$gcc -MM功能,这两个功能能自动的分析头文件的依赖关系,前者分析目标文件的所有头文件依赖关系,后者分析和我们自定义文件的依赖关系:
$gcc -M hello.c
hello.o: hello.c /usr/include/stdio.h /usr/include/features.h \
/usr/include/i386-linux-gnu/bits/predefs.h \
/usr/include/i386-linux-gnu/sys/cdefs.h \
/usr/include/i386-linux-gnu/bits/wordsize.h \
/usr/include/i386-linux-gnu/gnu/stubs.h \
/usr/include/i386-linux-gnu/gnu/stubs-32.h \
/usr/lib/gcc/i686-linux-gnu/4.6/include/stddef.h \
/usr/include/i386-linux-gnu/bits/types.h \
/usr/include/i386-linux-gnu/bits/typesizes.h /usr/include/libio.h \
/usr/include/_G_config.h /usr/include/wchar.h \
/usr/lib/gcc/i686-linux-gnu/4.6/include/stdarg.h \
/usr/include/i386-linux-gnu/bits/stdio_lim.h \
/usr/include/i386-linux-gnu/bits/sys_errlist.h hello.h
$gcc -MM hello.c
hello.o: hello.c hello.h
可以看到,他们的输出的格式刚好就是我们写的依赖关系的格式,所以我们可以综合利用伪目标,重定向,include关键字实现对头文件更新的自动检查
.PHONY:all
all:hello dependency
hello:hello.o
gcc hello.o -o hello
hello.o:hello.c
gcc -c hello.c -o hello.o
dependency:headers
headers:
gcc -M hello.c > headers
include headers
.PHONY:clean
clean:
rm -rf hello *.o
分析:make缺省目标会自动以第一个目标为目标,首先依次检查hello<-hello.o<-hello.c发现没有文件被更新,dependency并不是一个文件,也没有时间戳,所以也没有被更新,但是dependency每次都会执行刷新headers文件,我们又include了headers,所以一旦headers里面写的头文件有更新,就会通过hello.o<-xxx.h来找到更新关系,进而更新hello.o并进一步更新hello。至此实现了对头文件的自动依赖问题的解决。
执行效果:
//程序就是输出这个N值
#ifndef __HELLO_H__
#define __HELLO_H__
#define N 121220;
#endif
$./hello
num:121220
$vi hello.h #修改头文件中N的值为5
$make #果然重新编译了
gcc -c hello.c -o hello.o
gcc hello.o -o hello
gcc -M hello.c > headers
$./hello
num:5
Makefile目标,伪目标,头文件自动依赖的更多相关文章
- makefile 自动处理头文件的依赖关系 (zz)
现在我们的Makefile写成这样: all: main main: main.o stack.o maze.ogcc $^ -o $@ main.o: main.h stack.h maze.hst ...
- Makefile的伪目标
1.Makefile伪目标的格式: .PHONY : cleanclean: rm xxxx 2.Makefile伪目标的作用: 第一种情况: 如果我们需要书写这样的一个规则:规则所定义的命令不是去创 ...
- 第三篇 makefile的伪目标
我们来思考一下makefile中的目标究竟是什么?实际上,在默认情况下: 1.make将makefile的目标认为是一个文件: 2.make解释器比较目标文件和依赖文件的新旧关系,决定是否 ...
- makefile中伪目标的理解
1. 我们知道Makefile中的语法是这样: target ... : prerequisites ... command - - 2. 假如编译两个文件可以这么写: a.o:a.c gcc -c ...
- makefile之伪目标
伪目标 1. 伪目标的语法: 在书写伪目标时,首先需要声明伪目标,然后再定义伪目标规则. 1.1 声明伪目标: .PHONY clean (这里声明clean是伪目标) 1.2 定义伪目标规则: cl ...
- Makefile中头文件在依赖关系中作用
摘于:http://bbs.csdn.net/topics/120024677 (1)在makefile的依赖关系中用不用体现.h头文件?(2)如果在依赖关系中要体现.h头文件,应该体现到什么层次?= ...
- CocoaPods 导入第三方库头文件自动补齐
使用了一段时间CocoaPods来管理Objective-c的类库,方便了不少.但是有一个小问题,当我在xcode输入import关键字的时候,没有自动联想补齐代码的功能,需要手工敲全了文件名,难以适 ...
- CocoaPods导入第三方库头文件自动补齐
使用了一段时间CocoaPods来管理Objective-c的类库,方便了不少.但是有一个小问题,当我在xcode输入import关键字的时候,没有自动联想补齐代码的功能,需要手工敲全了文件名,难以适 ...
- jni头文件自动生成
写一个测试代码,大概如下 package aa.bb; public class TestClass { public native void aaaBBB(); } 在项目的src目录下执行 jav ...
随机推荐
- xshell 通过ssh连接 ubuntu15_x64
参考: http://www.cnblogs.com/wuyuegb2312/archive/2013/03/28/2986963.html 中文乱码在客户端xshell解决:http://jingy ...
- css知多少(1)——我来问你来答
1. 引言 各位前端或者伪前端(比如作者本人)的同志们,css对你们来说不是很陌生.比如我,在几年之前上大学的时候,给外面做网站就用css,而且必须用css.这样算下来也得六年多了,有些功能可能轻车熟 ...
- sass的四种css编译风格
sass的改变编译风格的语句: sass style expanded assets/sass/style1.sass:assets/css/style1.css 1.nested:默认 #main ...
- Stickup – 轻松实现元素固定效果的 jQuery 插件
粘贴是一个简单的 jQuery 插件,在页面滚动的时候固定一个元素到浏览器窗口的顶部,让其总是保持在视图中可见.这个插件作用于多页的网站,但是对于单页的布局有额外的功能.借助 CSS,还可以实现当前视 ...
- Slides - 在线制作效果精美的幻灯片(PPT)
Slides 是可以在浏览器中使用的在线幻灯片编辑器.与传统的演示软件,比如 PowerPoint 相比,Slides 不需要下载任何东西.你所有的信息都是安全地存储在我们的服务器上,无论你在哪里.不 ...
- go语言选择语句 switch case
根据传入条件的不同,选择语句会执行不同的语句.下面的例子根据传入的整型变量i的不同而打印不同的内容: switch i { case 0: fmt.Printf("0") case ...
- 移动Web开发的bug及解决方案
我目前移动Web开发遇到的bug以及解决方案(慢慢补充当中). 1.android4.0以上一部分手机的webview中,当canvas小于屏幕大小时,绘图时会出现重影,就是说一个图只绘制了一遍,却出 ...
- DOM中的事件处理概览与原理的全面剖析
事件是一种异步编程的实现方式,本质上是程序各个组成部分之间的通信,DOM支持大量的事件: 本文通过这几点向大家详细解析事件处理的基本原理:事件类型.事件目标.事件处理程序.事件对象.事件传播 最后再向 ...
- JavaScript强化教程——jQuery UI API 类别
---恢复内容开始--- 主要介绍:JavaScript强化教程—— jQuery UI API 类别 jQuery UI 在jQuery 内置的特效上添加了一些功能.jQuery UI 支持颜色动 ...
- 解决Visual Stuido 2013中Xamarin的*.axml文件没有智能提示问题
最近发现VS2013开发Android,发现.axml无法进行智能提示. 1.打开VS2013菜单栏中,点击工具--选项--文本编辑器--文件扩展名 2.增加一个扩展名为"axml" ...