您所在的位置: 首页 > 操作系统 > Linux > Linux基础 > Linux基础入门 >

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

http://os.51cto.com  2008-06-05 17:40  宇文  51CTO.com  我要评论(0)
  • 摘要:make是Linux下的一款程序自动维护工具,配合makefile的使用,就能够根据程序中模块的修改情况,自动判断应该对那些模块重新编译,从而保证软件是由最新的模块构成。
  • 标签:Make  Makefile  命令

四、用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并更新了库。


共6页: 上一页 [1] [2] [3] 4 [5] [6] 下一页
【内容导航】
 第 1 页:构建多个目标  第 2 页:内部规则
 第 3 页:后缀规则  第 4 页:用make管理程序库
 第 5 页:Makefile和子目录  第 6 页:小结和推荐文章
微软 Windows 7 技术前瞻
DNS服务器安装优化全攻略
浏览器的战国时代
Vista SP1对决XP SP3
LAMP技术精解
 
 验证码: (点击刷新验证码)   匿名发表
  • 网络工程师考试案例动手实验营

  • 作者:郭春柱
  • 本书依据2009年版《网络工程师考试大纲》的考核要求,深入研究了历年网络工程师考试试题的命题风格和试题结构,对考查的知识点..
Copyright©2005-2008 51CTO.COM 版权所有