深入学习Make命令和Makefile(下)(4)

来源:互联网 发布:top域名注册3元便宜 编辑:程序博客网 时间:2024/05/05 16:48

转载至:http://os.51cto.com/art/200806/75992_3.htm
 仅供学习所用

四、用make管理程序库

一般来说,程序库也是一种由一组目标程序构成的以.a为扩展名的文件,所以,Make命令也可以用来管理这些程序库。实际上,为了简化程序库的管理,make程序还专门设有一个语法:lib (file.o),这意味着目标文件file.o以库文件lib.a的形式存放,这意味着lib.a库依赖于目标程序file.o。此外,make命令还具有一个内部规则用来管理程序库,该规则相当于如下内容:

.c.a:
$(CC) -c $(CFLAGS) $<
$(AR) $(ARFLAGS) $@ $*.o

其中,宏$(AR)和$(ARFLAGS)分别表示指令AR和选项rv。如上所见,要告诉make用.c文件生成.a库,必须用到两个规则:第一个规则是说把源文件编译成一个目标程序文件。第二个规则表示使用ar 指令向库中添加新的目标文件。

所以,如果我们有一个名为filed的库,其中含有bar.o文件,那么第一规则中的$<会被替换为bar.c;在第二个规则中的$@被库名filed.a所替代,而$*将被bar所替代。

下面举例说明如何用make来管理库。实际上,用make来管理程序库的规则是很简单的。比如,我们可以将前面示例加以修改,让f1.o和f2.o放在一个称为mylib.a的程序库中,这时的Makefile几乎无需改变,而新的mymakefile4看上去是这样的:

all: main
# 使用的编译器
CC = gcc
# 安装位置
INSTDIR = /usr/local/bin
# include文件所在位置
INCLUDE = .
# 开发过程中使用的选项
CFLAGS = -g -Wall –ansi
# 用于发行时的选项
# CFLAGS = -O -Wall –ansi
# 本地库
MYLIB = mylib.a
main: main.o $(MYLIB)
$(CC) -o main main.o $(MYLIB)
$(MYLIB): $(MYLIB)(f1.o) $(MYLIB)(f2.o)
main.o: main.c def1.h
f1.o: f1.c def1.h def2.h
f2.o: f2.c def2.h def3.h
clean:
-rm main.o f1.o f2.o $(MYLIB)
install: main
@if [ -d $(INSTDIR) ]; \
then \
cp main $(INSTDIR);\
chmod a+x $(INSTDIR)/main;\
chmod og-w $(INSTDIR)/main;\
echo “Installed in $(INSTDIR)“;\
else \
echo “Sorry, $(INSTDIR) does not exist”;\
fi

注意:我们是如何让省缺规则来替我们完成大部分工作的。如今,我们可以试一下新版的makefile的工作情况:

$ rm -f main *.o mylib.a

$ make -f Mymakefile4
gcc -g -Wall -ansi -c -o main.o main.c
gcc -g -Wall -ansi -c -o f1.o f1.c
ar rv mylib.a f1.o
a - f1.o
gcc -g -Wall -ansi -c -o f2.o f2.c
ar rv mylib.a f2.o
a - f2.o
gcc -o main main.o mylib.a

$ touch def3.h

$ make -f Mymakefile4
gcc -g -Wall -ansi -c -o f2.o f2.c
ar rv mylib.a f2.o
r - f2.o
gcc -o main main.o mylib.a
$

现在对上面的例子做必要的说明。首先删除全部目标程序文件和程序库,然后让make 重新构建main,因为当连接main.o时需要用到库,所以要先编译和创建库。此后,我们还测试f2.o的依赖关系,我们知道如果def3.h发生了改变,那么必须重新编译f2.c,事实表明make在重新构建main可执行文件之前,正确地编译了f2.c并更新了库。


原创粉丝点击