make命令和makefile文件(四)

make命令和makefile文件

1. makefile的语法
2. make命令的选项和参数
3. makefile文件中的注释
4. makefile文件中的宏
5. 多个目标
6. 内置规则
7. 后缀和模式规则
8. 用make管理库函数
9. 高级主题:makefile文件和子目录
10.GUN make和gcc

4.makefile文件中的宏

在前面三篇文章中讲述的内容就是make命令和makefile文件的全部,对于管理包含多个源文件的项目来说,它们仍然是强有力的工具。但是,对于管理包含非常多源文件的大型项目来说,它们就显得过于庞大并缺乏弹性。因此,makefile文件允许你使用宏以一种更通用的格式来书写它们。
你通过语句MACRONAME=value在makefile文件中定义宏,引用宏的方法是使用 ( M A C R O N A M E ) 或 (MACRONAME)或 MACRONAME{MACRONAME}。make的某些版本还接受$MACRONAME的用法。如果想把一个宏的值设置为空,你可以令等号(=)后面留空。
makefile文件中的宏常被用于设置编译器的选项。在软件的开发过程中,通常开发人员不会对编译结果进行优化,而是将调试信息包含进去。但对于软件的发行版,往往又需反过来做,即编译结果是一个不包含调试信息的容量较小的二进制可执行文件,使其执行速度尽可能快。
Makefile1文件的另一问题是,它假设编译器的名字是gcc,而在其他UNIX系统中,编译器的名字可能是cc或c89。如果想将makefile文件移植到另一版本的UNIX系统中,或在现有系统中使用另一个编译器,为了使其工作,你将不得不修改makefile文件中许多行的内容。宏是用来收集所有这些与系统相关内容的好方法,通过使用宏定义,你可以方便地修改这些内容。

宏通常都是在makefile文件中定义的,但你也可以在调用make命令时在命令行上给出宏定义,例如命令make CC=c89。命令行上的宏定义将覆盖在makefile文件中的宏定义。当在makefile文件之外使用宏定义时,要注意宏定义必须以单个参数的形式传递,所以应避免在宏定义中使用空格或应像下面这样给宏定义加上引号:make “CC = c89”。
实验:带宏定义的makefile文件
下面是makefile文件的升级版本Makefile2,它使用了一些宏定义;

all:myapp
#what compiler
CC = gcc
#Where are include files kept
INCLUDE = .
#Options for development
CFLAGS = -g -Wall -ansi

myapp: main.o 2.o 3.o
        $(CC) -o myapp main.o 2.o 3.o
main.o: main.c a.h
        $(CC) -I$(INCLUDE) $(CFLAGS) -c main.c
2.o: 2.c a.h b.h
        $(CC) -I$(INCLUDE) $(CFLAGS) -c 2.c
3.o: 3.c b.h c.h
        $(CC) -I$(INCLUDE) $(CFLAGS) -c 3.c
clean:
        -rm *.o myapp

注意:此源代码会上传到资源里
删除就得安装(中间)文件,并通过这个新的makefile文件创建新的安装文件,可以看到如下输出:
在这里插入图片描述
实验解析:
make命令将 ( C C ) 、 (CC)、 CC(CFLAGS)和$(INCLUDE)替换为相应的宏定义,这与C语言编译器对#define语句的处理方式很相似。现在,如果想改变编译器命令,你只需修改makefile文件中的一行即可。
事实上,make命令内置了一些特殊的宏定义,通过使用它们,你可以让makefile文件变得更加简洁。我们将几个较常用的宏列在下中,其使用方法可以在后面的示例中看到。这些宏在使用前才展开,所以它们的含义会随着makefile文件的处理进展而发生变化。事实上,如果这些内置宏的用法不是这样,它们就没有什么用处了。

在这里插入图片描述
在makefile文件中,你可能还会看到下面两个有用的特殊字符,它们出现在命令之前。
❑ -:告诉make命令忽略所有错误。例如,如果想创建一个目录,但又想忽略任何错误(比如目录已存在),你就可以在mkdir命令的前面加上一个减号。你将在本章后面的例子中看到符号-的应用。
❑ @:告诉make在执行某条命令前不要将该命令显示在标准输出上。如果想用echo命令给出一些说明信息,这个字符将非常有用。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

helmer_hanssen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值