库目标
库目标是目标的一个特殊类型,用特别的方法支持库目标。因为库中含有不同的模块,提供一系列
的函数,所以库目标要考虑到库中单独模块的地址。当一个目标或依赖表中目标含有括号“()”,则被认为
是一个库目标。例如:
libmy.a(myfun.o): myfun.c myfun.h
则表示myfun.o 在库libmy.a 中。库libmy.a 依赖于myfun.c 和myfun.h 文件。当库目标在依赖
表中的情况如下:
libmy.a: libmy(myfun.o) libmy(another.o)表示库libmy.a 依赖于myfun.o 和another.o 文件。
有些make 允许在括号中包括多个目标。有些只允许在括号中包含一个目标。
例如:
libmy.a: libfoo.a(myfun.o another.o) 等同于libmy.a: libmy(myfun.o)
libmy(another.o)
注意 括号中不要有空格,如果make 支持指定多个目标文件时,空格用来分隔目标文件。如果一个库目
标的不同依赖文件,有不同的编译选项,这时双冒号能够对一个目标定义多次依赖表。假设有一个模块
third.o,它需要在编译时选取其他的编译选项,而myfun.o 和another.o 需要另一些编译选项,就可以
使用两个冒号来定义目。例如:
libmy.a:: libmy.a(third.o)
libmy.a:: libmy.a(my.o) libmy.a(another.o)
使用后缀规则的目标
make 有自己规定的通用目标,也就是后缀规则。后缀规则是一次性告诉make如何建立某些类型
目标。例如有makele 文件如下:
all: hello hello1
hello: hello.o
cc -o hello -L/usr/X11R6/lib -L/usr/lib -lXm -lXt -lX11 hello.o
hello1: hello1.o
cc -o hello1 -L/usr/X11R6/lib -L/usr/lib -lXm -lXt -lX11 hello1.o
hello.o: hello.c
cc -c hello.c
hello1.o: hello1.c
cc -c hello1.c
clean:
rm *.o hello hello1
从中读者可以发现有许多重复内容。例如,生成hello 和hello1 的命令类似,生成hello.o 和
hello1.o 的命令类似。除了编译或链接的文件不一样,其他都一样。这时,我们就可以使用后缀规则。
下面的.c.o 规则告诉make 怎样把以.c 结尾的文件转换为以.o 结尾的文件:
.c.o:
cc -c $<
在这个.c.o 规则中用到了宏“$<”,它以当前的依赖文件名代入规则中。有关这些特殊的宏将在后面
介绍。把.c.o 规则用到前面的例子中可以简化为:
LDFLAGS=-L/usr/X11R6/lib -L/usr/lib -lXm -lXt -lX11
.SUFFIXES:
.SUFFIXES: .c .o
.c.o: