make命令和makefile文件
1. makefile的语法
2. make命令的选项和参数
3. makefile文件中的注释
4. makefile文件中的宏
5. 多个目标
6. 内置规则
7. 后缀和模式规则
8. 用make管理库函数
9. 高级主题:makefile文件和子目录
10.GUN make和gcc
8.用make管理函数库
对于大型项目,一种比较方便的做法是用函数库来管理多个编译产品。函数库实际上就是文件,它们通常以.a(a是英文archive的首字母)为后缀名,在该文件中包含了一组目标文件。make命令用一个特殊的语法来处理函数库,这使得函数库的管理工作变得非常容易。
用于管理函数库的语法是lib(file.o),它的含义是目标文件file.o是存储在函数库lib.a中的。make命令用一个内置规则来管理函数库,该规则的常见形式如下所示:
.c.a:
$(CC) -c $(CFLAGS) $<
$(AR) $(ARFLAGS) $@ $*.O
宏 ( A R ) 和 (AR)和 (AR)和(ARFLAGS)的默认取值通常分别是命令ar和选项rv。这个相当简洁的语法告诉make,要想从.c文件得到.a库文件,它必须应用上面两条规则。
- 第一条规则告诉它必须编译源文件以生成目标文件。
- 第二条规则告诉它用ar命令将新的目标文件添加到函数库中。
因此,如果有一个名为fud的函数库,其中包含目标文件bas.o,则第一条规则中的
<
将
被
替
换
为
b
a
s
.
c
,
而
第
二
条
规
则
中
的
<将被替换为bas.c,而第二条规则中的
<将被替换为bas.c,而第二条规则中的@和
*
将
被
分
别
替
换
为
库
文
件
f
u
d
.
a
和
名
字
b
a
s
。
关
于
*将被分别替换为库文件fud.a和名字bas。 关于
*将被分别替换为库文件fud.a和名字bas。关于@、
*
和
*和
*和<宏代表的含义:
实验 管理函数库
在实际应用中,管理函数库规则的使用非常简单。下面将前面例程的2.o 和3.o放入函数库mylib.a中。只需要对Makefile3文件做很少的修改,最终的makefile文件Makefile5如下:
all: myapp
#what compiler
CC = gcc
#Where to install
INSTDIR = /usr/local/bin
#Where are include files kept
INCLUDE = .
#Options for development
CFLAGS = -g -Wall -ansi
#Local Libraries
MYLIB = mylib.a
myapp: main.o $(MYLIB)
$(CC) -o myapp main.o $(MYLIB)
$(MYLIB):$(MYLIB)(2.o) $(MYLIB)(3.o)
main.o: main.c a.h
2.o: 2.c a.h b.h
3.o: 3.c b.h c.h
clean:
-rm main.o 2.o 3.o $(MYLIB)
install: myapp
@if [ -d $(INSTDIR) ];\
then \
cp myapp $(INSTDIR);\
chmod a+x $(INSTDIR)/myapp;\
chmod og-w $(INSTDIR)/myapp;\
echo "Installed in $(INSTDIR)";\
else \
echo "Sorry,$(INSTDIR) does not exist";\
fi
请注意在Makefike5中是如何利用默认规则来完成大部分工作的。下面进行测试。
实验解析:
首先,删除所有的目标文件和库文件,然后执行make命令创建myapp。make命令首先编译并创建函数库,然后把main.o和该函数库链接起来以创建myapp。接下来测试目标3.o的依赖规则,它告诉make命令,当文件c.h发生改变时,源文件3.c必须被重新编译。make命令正确地完成了这一工作,它首先编译源文件3.c,然后更新函数库,最后重新链接函数库并创建一个新的可执行文件myapp。