makefile_2
我们的工程有 8 个 C 文件,和 3 个头文件,
我们要写一个 Makefile 来告诉 make 命令如何编译和链接这几个文件。我们的规则是:
1)如果这个工程没有编译过,那么我们的所有 C 文件都要编译并被链接。
2)如果这个工程的某几个 C 文件被修改,那么我们只编译被修改的 C 文件,并链接目
标程序。
3)如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的 C 文件,
并链接目标程序。
在讲述这个 Makefile 之前,还是让我们先来粗略地看一看 Makefile 的规则。
target ... : prerequisites ...
command
...
...
target 也就是一个目标文件,可以是 Object File,也可以是执行文件。还可以是
一个标签(Label),对于标签这种特性,在后续的“伪目标”章节中会有叙述。
prerequisites 就是,要生成那个 target 所需要的文件或是目标。
command 也就是 make 需要执行的命令。(任意的 Shell 命令)
让 make 自动推导
只要 make 看到一个[.o]文件,它就会自动的把[.c]文件加在依赖关系中,如果 make 找
到一个 whatever.o,那么 whatever.c,就会是 whatever.o 的依赖文件。并且 cc -c
whatever.c 也会被推导出来,于是,我们的 makefile 再也不用写得这么复杂。我们的
是新的 makefile 又出炉了。
objects = main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
edit : $(objects)
cc -o edit $(objects)
main.o : defs.h
kbd.o : defs.h command.h
command.o : defs.h command.h
display.o : defs.h buffer.h
insert.o : defs.h buffer.h
search.o : defs.h buffer.h
files.o : defs.h buffer.h command.h
utils.o : defs.h
.PHONY : clean
clean :
-rm edit $(objects)
这种方法,也就是 make 的“隐晦规则”。上面文件内容中,
“.PHONY”表示,clean 是个
伪目标文件。.PHONY 意思表示 clean 是一个“伪目标”,。而在 rm 命令前面加了一个小减号
的意思就是,也许某些文件出现问题,但不要管,继续做后面的事。当然,clean 的规则不
要放在文件的开头,不然,这就会变成 make 的默认目标,相信谁也不愿意这样。不成文的
规矩是——“clean 从来都是放在文件的最后”
。
四、环境变量 MAKEFILES
如果你的当前环境中定义了环境变量 MAKEFILES,那么,make 会把这个变量中的值做一个
类似于 include 的动作。这个变量中的值是其它的 Makefile,用空格分隔。只是,它和
include 不同的是,从这个环境变中引入的 Makefile 的“目标”不会起作用,如果环境
变量中定义的文件发现错误,make 也会不理。
但是在这里我还是建议不要使用这个环境变量,因为只要这个变量一被定义,那么当你使用
make 时,所有的 Makefile 都会受到它的影响,这绝不是你想看到的。在这里提这个事,
只是为了告诉大家,也许有时候你的 Makefile 出现了怪事,那么你可以看看当前环境中有
没有定义这个变量。
五、make 的工作方式
GNU 的 make 工作时的执行步骤入下:(想来其它的 make 也是类似)
1、读入所有的 Makefile。
2、读入被 include 的其它 Makefile。
3、初始化文件中的变量。
4、推导隐晦规则,并分析所有规则。
5、为所有的目标文件创建依赖关系链。
6、根据依赖关系,决定哪些目标要重新生成。
7、执行生成命令。
1-5 步为第一个阶段,6-7 为第二个阶段。第一个阶段中,如果定义的变量被使用了,那么,
make 会把其展开在使用的位置。但 make 并不会完全马上展开,make 使用的是拖延战术,
如果变量出现在依赖关系的规则中,那么仅当这条依赖被决定要使用了,变量才会在其内部
展开。
第五章
书写规则
规则包含两个部分,一个是依赖关系,一个是生成目标的方法。
在 Makefile 中,规则的顺序是很重要的,因为,Makefile 中只应该有一个最终目标,其
它的目标都是被这个目标所连带出来的,所以一定要让 make 知道你的最终目标是什么。一
般来说,定义在 Makefile 中的目标可能会有很多,但是第一条规则中的目标将被确立为最
终的目标。如果第一条规则中的目标有很多个,那么,第一个目标会成为最终的目标。make
所完成的也就是这个目标。
makefile_2的更多相关文章
- 4通用Makefile编写
a.c #include<stdio.h> #include "a.h" int main() { printf("hello world\n"); ...
随机推荐
- Pseudo-elements ::before, ::after 範例
xhtml <strong class="amount">700</strong> css .amount::before {content:"$ ...
- Notions of Flow Networks and Flows
这篇随笔是对算法导论(Introduction to Algorithms, 3rd. Ed.)第26章 Maximum Flow的摘录. ------------------------------ ...
- 北航 编译实践 PL/0文法
编译实践-PL\0编译系统实现 姓名: 专业: 计算机科学与技术 学院: 软件学院 提交时间: 2013年12月25日 北京航空航天大学·软件学院 编译实践-PL\0编译系统实现 实验要求 以个人 ...
- Linux文件目录权限浅谈
1.基本权限三种(1)r (read) 读 针对目录,有读(r)权限就代表能对此目录有列表功能,就是可以执行ls命令进行查看,另外还有cp的功能.针对文件,有读(r)权限就代表能对此文件有阅读功能,可 ...
- boost构造,解析json
void asynDBCenter::isGetActorInfoEx(void* on_process, const char* arg) { std::stringstream ros(arg); ...
- tomcat管理员配置
纸上得来终觉浅,绝知此事要躬行 博客园 首页 新闻 新随笔 联系 管理 随笔- 458 文章- 0 评论- 38 Tomcat的Manager显示403 Access Denied 管理to ...
- linux学习笔记二-----文件权限管理
一.分析文件权限(ln -s 文件名 快捷方式名 用来创建文件的快捷方式,下方ll查看信息时会在第一个字符处显示l) [hjp@bogon ~]$ ll total 4 drwxrwxr-x. 2 h ...
- Machine Learning Methods: Decision trees and forests
Machine Learning Methods: Decision trees and forests This post contains our crib notes on the basics ...
- linux init.d脚本编写模板
#!/bin/bash ### BEGIN INIT INFO # # Provides: location_server # Required-Start: $local_fs $remote_fs ...
- MyBatis 用户表记录数查询
搭建MyBatis开发环境,实现用户表记录数查询 1.在MyEclipse中创建工程,导入MyBatis的jar包