摘要:
3.变量 请点评这一节我们详细看看Makefile中关于变量的语法规则。先看一个简单的例子:foo = $(bar) bar = Huh? all: @echo $(foo)我们执行make将会打出Huh?。当make读到foo = $(bar)时,确定foo的值是$(bar),但并不立即展开$(bar),然后读到bar = Huh?,确定bar的值是Huh?,然后在执行规则all:的命令列表时才需要展开$(foo),得到$(bar),再展开$(bar),得到Huh?。因此,虽然bar的定义写在foo之后,$(foo)展开还是能够取到$(bar)的值。这种特性有好处也有坏处。好处是我们可以把. 阅读全文
2013年6月26日
摘要:
2.隐含规则和模式规则 请点评上一节的Makefile写得中规中矩,比较繁琐,是为了讲清楚基本概念,其实Makefile有很多灵活的写法,可以写得更简洁,同时减少出错的可能。本节我们来看看这样一个例子还有哪些改进的余地。一个目标依赖的所有条件不一定非得写在一条规则中,也可以拆开写,例如:main.o: main.h stack.h maze.hmain.o: main.c gcc -c main.c就相当于:main.o: main.c main.h stack.h maze.h gcc -c main.c如果一个目标拆开写多条规则,其中只有一条规则允许有命令列表,其它规则应该没有命令列表,否 阅读全文
摘要:
1.基本规则 请点评除了Hello World这种极简单的程序之外,一般的程序都是由多个源文件编译链接而成的,这些源文件的处理步骤通常用Makefile来管理。Makefile起什么作用呢?我们先看一个例子,这个例子由例12.3 “用深度优先搜索解迷宫问题”改写而成:/* main.c */#include #include "main.h"#include "stack.h"#include "maze.h"struct point predecessor[MAX_ROW][MAX_COL] = { {{-1,-1}, {-1,-1 阅读全文
摘要:
4.自动处理头文件的依赖关系 现在我们的Makefile写成这样:all: mainmain: main.o stack.o maze.o gcc $^ -o $@main.o: main.h stack.h maze.hstack.o: stack.h main.hmaze.o: maze.h main.hclean: -rm main *.o.PHONY: clean按照惯例,用all做缺省目标。现在还有一点比较麻烦,在写main.o、stack.o和maze.o这三个目标的规则时要查看源代码,找出它们依赖于哪些头文件,这很容易出错,一是因为有的头文件包含在另一个头文件中,在写规则时很容易 阅读全文