linux程序设计——make命令和makefile文件(第九章)

58 篇文章 0 订阅
57 篇文章 9 订阅

9.2 make命令和makefile文件

9.2.6 内置规则

make命令本身带有大量的内置规则,它们可以极大地简化makefile文件的内容,尤其在拥有许多源文件时更是如此.为了测试这些内置规则,下面创建文件foo.c,他是一个传统的"hello world"程序:
#include <stdlib.h>
#include <stdio.h>
int main(){
    printf("hello world\n");
    exit(EXIT_SUCCESS);
}
不指定makefile文件时,尝试用make命令来编译它:
make foo
cc foo.c -o foo
可以看到, make命令知道如何调用编译器,虽然此例中,它选择的是cc而不是gcc(在linux系统中,这没有问题,因为cc通常是gcc的一个连接文件).有时,这些内置规则又被成为推导规则,由于它们都会使用宏定义,因此可以通过给宏赋予新值来改变其默认行为.
rm foo
make CC=gcc CFLAGS="-Wall -g" foo
考虑到存在这些内置规则,可以就爱那个文件makefile中用于制作目标的规则去掉,而只需指定依赖关系,从而达到简化makefile文件的目的.

9.2.7 后缀和模式规则

内置规则在使用时都利用了文件的后缀名,所以当给出带有某个特定后缀名的文件时,make命令知道应该用哪个规则来创建带有另一个不同后缀名的文件.最常见的一条规则是用于从一个以.c为后缀名的文件创建出一个以.o的后缀名的文件.
要想增加一条新的后缀规则,首先需要在makefile文件中增加一行语句,告诉make命令这个新的后缀名.然后即可用这个新的后缀名来定义规则,make使用特殊语法:
.<odl_suffix>.<new_suffix>:
来定义一条通用规则,利用该规则可以从带有旧后缀名的文件创建带有新后缀名的文件,并保留原文件的前半部分.
下面是makefile文件的一个片段,它用一个新的通用规则将.cpp文件编译为.o文件:
.SUFFIXES:    .cpp
.cpp.o:
    $(CC) -xc++ $(CFLAGS) -I$(INCLUDE) -c $<
特殊依赖关系.cpp.o告诉make,紧跟其后的规则是用于将后缀名为.cpp的文件转换为后缀名为.o的文件.在定义这个依赖关系时,使用了特殊的宏名称,这是因为此时还不知道将要被转换的文件的名字.要理解这条规则,只需要记住宏$<将被扩展为起始文件的名字(包含旧的后缀名).注意,只需要告诉make如何从.cpp文件得到.o文件,make已经知道如何从一个目标文件得到一个二进制可执行文件了.
当调用make命令时,它将使用这条新规则从bar.cpp文件得到bar.o文件,然后再使用它的规则从.o文件得到二进制可执行文件.-xc++标志的作用是告诉gcc编译器这是一个C++源文件.
如今的make版本已经知道如何处理后缀名.cpp的C++源文件了,但是当需要将一种类型的文件转换为另一种类型的文件时,这个技术仍然很有用.
最新的make版本还包含一个新的语法以实现同样的效果,而且功能更加强大.例如,模式规则可以用%通配符来匹配文件名,而不是仅仅依赖于文件的后缀名.
可以达到与上例中.cpp规则同样效果的模式规则如下所示:
%.cpp: %o
    $(CC) -xc++ $(CFLAGS) -I$(INCLUDE) -c $<

9.2.8 用make管理函数库

对于大型项目,一种比较方面的做法是用函数库来管理多个编译产品.函数库实际上就是文件,它们通常以.a(a是archive的首字母)为后缀名,在该文件中包含了一组目标文件.make命令用一种特殊的语法来处理函数库,这使得函数库的管理工作变得非常容易.
用于管理函数库的语法是lib(file.o),它的含义是目标文件file.o是存储在函数库lib.a中的.make命令用一个内置规则管理函数库,该规则的常见形式如下所示:
.c.a:
    $(CC) -o $(CFLAGS) $<
    $(AR) $(ARFLAGS) $@ $*.O
宏$(AR)和$(ARFLAGS)的默认取值通常分别是命令ar和选项rv.这个相当简洁的语法告诉make,要想从.c文件得到.a库文件,它们应该应用上面两条规则.
第一条规则告诉它必须编译源文件以生成目标文件
第二条规则告诉它用ar命令将新的目标文件添加到函数库中
.
因此,如果有一个名为fud的函数库,其中包含目标文件bas.o,则第一条规则中的$<将被替换为bas.c,而第二条规则中的$@和$*将被分别替换为库文件fud.a和名字bas.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值