makefile官方文档学习笔记

mkafile学习

前言

官方文档

C到二进制文件

  1. 编译为目标文件
  2. 链接为可执行文件

When recompiles the editor, each changed C source file must be recompiled. If a header file has changed, each C source file that includes the header file must be recompiled to be safe. When recompiles the editor, each changed C source file must be recompiled. If a header file has changed, each C source file that includes the header file must be recompiled to be safe.

Makefile入门

简单的一条规则

target … : prerequisites …
        recipe
        …
        …
target含义
  1. 程序生成文件的名称
  2. 执行动作
prerequisites含义

先决条件(依赖):生成target的输入文件,通常有多个

recipe含义

执行的动作,每一行前需要一个tab,否则会出错

长的一行可使用"\"分成两行

样例

edit : main.o kbd.o command.o display.o \
       insert.o search.o files.o utils.o
        cc -o edit main.o kbd.o command.o display.o \
                   insert.o search.o files.o utils.o

main.o : main.c defs.h
        cc -c main.c
kbd.o : kbd.c defs.h command.h
        cc -c kbd.c
command.o : command.c defs.h command.h
        cc -c command.c
display.o : display.c defs.h buffer.h
        cc -c display.c
insert.o : insert.c defs.h buffer.h
        cc -c insert.c
search.o : search.c defs.h buffer.h
        cc -c search.c
files.o : files.c defs.h buffer.h command.h
        cc -c files.c
utils.o : utils.c defs.h
        cc -c utils.c
clean :
        rm edit main.o kbd.o command.o display.o \
           insert.o search.o files.o utils.o

使用

make

即可生成名称为edit的可执行文件

使用

make clean

清除所有目标文件

clean没有依赖,也不是任何obj的依赖,属于伪目标,make默认不会执行它,除非指明使用它

Make命令执行Makefile的步骤

Make读取当前目录中的makefile,并从处理第一条规则开始。在本例中,此规则用于重新链接编辑;但是在make完全处理此规则之前,它必须处理edit所依赖的文件的规则,在本例中,这些文件是目标文件。每个文件都根据自己的规则进行处理。这些规则说要更新每一个。O '文件通过编译其源文件。如果源文件或任何命名为先决条件的头文件比目标文件更新,或者如果目标文件不存在,则必须重新编译。
对于没有依赖到的文件,对其规则不操作,除非像make clean一样特别指定
把edit文件的依赖都处理完后,类似地,make会查看是否需要重新链接

变量的使用

上面的例子极不优雅,每次新添加文件,都需要再改动makefile,文件会非常长,并且很容易出现纰漏,使用变量(类似于C语言的宏)来提高makefile的健壮性。

标准做法是使用一个类似于objs变量来表示目标文件的列表

改进样例

objects = main.o kbd.o command.o display.o \
          insert.o search.o files.o utils.o

edit : $(objects)
        cc -o edit $(objects)
main.o : main.c defs.h
        cc -c main.c
kbd.o : kbd.c defs.h command.h
        cc -c kbd.c
command.o : command.c defs.h command.h
        cc -c command.c
display.o : display.c defs.h buffer.h
        cc -c display.c
insert.o : insert.c defs.h buffer.h
        cc -c insert.c
search.o : search.c defs.h buffer.h
        cc -c search.c
files.o : files.c defs.h buffer.h command.h
        cc -c files.c
utils.o : utils.c defs.h
        cc -c utils.c
clean :
        rm edit $(objects)#'$'表示对变量的引用

隐含规则

对于.o文件的更新,make默认使用cc -o xx.c -o xx.o,所以以上makefile文件中的recipe部分可以省略,让make自己推理,而这样使用时,逻辑上,xx.c自然就是xx.o的依赖,所以prequesites中也可以省略,故最终文件可以简化为

objects = main.o kbd.o command.o display.o \
          insert.o search.o files.o utils.o

edit : $(objects)
        cc -o edit $(objects)

main.o : defs.h
kbd.o : defs.h command.h
command.o : defs.h command.h
display.o : defs.h buffer.h
insert.o : defs.h buffer.h
search.o : defs.h buffer.h
files.o : defs.h buffer.h command.h
utils.o : defs.h

.PHONY : clean
clean :
        rm edit $(objects)

另一种风格(不太建议)

objects = main.o kbd.o command.o display.o \
          insert.o search.o files.o utils.o

edit : $(objects)
        cc -o edit $(objects)

$(objects) : defs.h
kbd.o command.o files.o : command.h
display.o insert.o search.o files.o : buffer.h

伪目标的声明

.PHONY : clean
clean :
        -rm edit $(objects)

放止大型工程中与clean文件混淆

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ㄨㄛˇㄞˋㄋㄧˇ

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

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

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

打赏作者

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

抵扣说明:

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

余额充值