Makefile学习之路——1

编写makefile,不是一个猛子扎进去试着写一个规则并对之调试,而应该先采用面向依赖关系的思考方法勾勒出makefile要表达怎样的依赖关系,这一点尤为重要。通过不断地练习这种思考方法,才可能达到流畅地编写makefile的能力.
分别编写好两个源文件之后,执行效果如下:

makefile文件为:
all:main.o foo.o
gcc -o app main.o foo.o
main.o:main.c
gcc -o main.o -c main.c
foo.o:foo.c
gcc -o foo.o -c foo.c
clean:
rm app main.o foo.o
为什么第二次make还是又生成了app这个可执行文件呢?
make是通过文件的时间戳来判定哪些文件需要编译的,所以如果电脑系统时间变更,将可能影响make的执行。由于第二次make的时候,虽然foo和main的目标文件已经生成了,但all目标在编译过程中并不生成,所以在此执行make,又生成了app,更改makefile(红色部分为更改部分)如下:
app:main.o foo.o
gcc -o app main.o foo.o
main.o:main.c
gcc -o main.o -c main.c
foo.o:foo.c
gcc -o foo.o -c foo.c
clean:
rm app main.o foo.o
这样再有多次执行make并且文件时间戳没有改变时,make会提示你:
make: 'app' is up to date.//app已经是最新的。
我们对foo.c做点改动,看make是否可以发现我们的改动并重新编译,注意make是按照时间戳来判定文件是否有改动的,touch命令可以改变文件的时间戳,这相当于对文件做了一次修改。
touch:将文件的访问及修改时间都更新成目前时间,如果文件不存在,则创建一个字节数为0的空文件。

可以看到touch之后时间戳改变,然后我们make试试。

果然,make察觉到了foo.c的更改,并重新构建了。
现在的makefile虽然能够工作,但不够灵活,下面的文章让makefile更专业。




并不一定非要命名为makefile,但是linux设计哲学是简单就是美,所以当不用 -f 指定文件的时候,make默认以Makefile或者makefile查找:

Makefile学习之路——1的更多相关文章
- Makefile学习之路——4
		
变量的类别有递归扩展变量和简单扩展变量.只用一个“=”符号定义的变量被称为递归扩展变量.通过下面例子观察递归扩展变量的特点. .PHONY: all foo=$(bar) bar=$(ugh) ugh ...
 - Makefile学习之路——2
		
让你的makefile更专业. 在上一个Makefile所在目录下通过touch命令创建一个clean文件,执行make clean,将发现make总是提示clean文件是最新的,而不是按我们期望的那 ...
 - Makefile学习之路——3
		
特殊变量: 在Makefile中,有两个变量特殊变量会经常用到:MAKE和MAKECMDGOALS.MAKE变量表示的是当前处理Makefile的命令名是什么.当需要在Makefile中运行另一个Ma ...
 - Makefile学习之路6——让编译环境更加有序
		
在大多项目中都会合理设计目录结构来提高维护性,在编译一个项目时会产生大量中间文件,如果中间文件直接和源文件放在一起,就显得杂乱而不利于维护.在为现在这个complicated项目编写makefile之 ...
 - Makefile学习之路5——通过函数增强功能
		
通过函数能显著增强Makefile的功能.对于simple项目的Makefile,尽管使用了模式规则,但还是有一件比较麻烦的事情,就是要在Makefile中指明每一个项目源文件.下面介绍几个后期会使用 ...
 - 运用Autoconf和Automake生成Makefile的学习之路
		
作为Linux下的程序开发人员,大家一定都遇到过Makefile,用make命令来编译自己写的程序确实是很方便.一般情况下,大家都是手工写一个简单Makefile,如果要想写出一个符合自由软件惯例的M ...
 - Qt 学习之路 2(7):MainWindow 简介
		
Qt 学习之路 2(7):MainWindow 简介 豆子 2012年8月29日 Qt 学习之路 2 29条评论 前面一篇大致介绍了 Qt 各个模块的相关内容,目的是对 Qt 框架有一个高屋建 ...
 - Qt 学习之路 2(3):Hello, world!
		
豆子 2012年8月22日 Qt 学习之路 2 107条评论 想要学习 Qt 开发,首先要搭建 Qt 开发环境.好在现在搭建 Qt 开发环境还是比较简单的.我们可以到 Qt 官方网站找到最新版 ...
 - jQuery学习之路(1)-选择器
		
▓▓▓▓▓▓ 大致介绍 终于开始了我的jQuery学习之路!感觉不能再拖了,要边学习原生JavaScript边学习jQuery jQuery是什么? jQuery是一个快速.简洁的JavaScript ...
 
随机推荐
- eclipse Java compiler level does not match the version of the installed Java project facet.
			
eclipse Java compiler level does not match the version of the installed Java project facet. Create ...
 - opencv-3.0.0-beta和opencv2版本号的差别
			
我的机器:64位系统 第一步: opencv官网下载opencv3.0.0-beta版本号.解压到自己的目录,我的目录是E:\,解压后在E盘出现名为opencv的目录.该目录下有两个子目录 第二步:配 ...
 - spring.net aop 讲解
			
spring.net aop几个术语: 切面:针对类 切点:针对方法 object.xml <?xml version="1.0" encoding="utf-8& ...
 - Web Service-WSDL详解
			
WSDL指网络服务描述语言 (Web Services Description Language), 是一种用XML编写的文档, 用于描述Web Service和函数.参数以及返回值等; 文档内规定了 ...
 - protobuf配置与使用
			
Protobuf配置与安装 1 安装与配置 1.protobuf是google公司提出的数据存储格式,详细介绍可以参考:https://code.google.com/p/protobuf/ 2.下载 ...
 - ubuntu 忘记root密码了不用怕,看这里
			
方法来自这里:http://jingyan.baidu.com/article/8065f87fe20832233024985a.html
 - 百度UEditor富文本编辑器去除过滤div等标签
			
将设计排版好的页面html代码上传到数据库,再读取出来的时候发现所有的div都被替换成了p标签. 解决方法: 首先在ueditor.all.js文件内搜索allowDivTransToP,找到如下的代 ...
 - MongoDB基本管理命令 [转]
			
MongoDB基本管理命令 linux下配置安装mongodb 10分钟玩转mongoDB 官网安装教程 使用命令行方式连接mongodb: mongo /admin -u用户名 -p密码 --连接 ...
 - ASP.NET MVC下的异步Action的定义和执行原理[转]
			
http://www.cnblogs.com/artech/archive/2012/06/20/async-action-in-mvc.html Visual Studio提供的Controller ...
 - JQuery包装集size,length,index,slice,find,filter,is,children,next,nextAll,parent,parents,closest,siblings,add,end,andSelf的用法
			
在使用Jquery包装集的知识之前首先要注意三个概念(当前包装集.新包装集.包装集内部元素)的区别. <!DOCTYPE html> <html xmlns="http:/ ...