makefile基础(完全0基础可懂)

本文详细介绍了如何编写一个makefile文件,用于自动化地将目录下的C源文件编译成无后缀的可执行文件。通过逐步改良makefile,读者可以理解makefile的基础规则,包括目标、依赖、命令、wildcard函数、patsubst函数以及静态模式规则。最后,文章还展示了如何添加清理目标以删除编译生成的文件。

 本文通过编写一个,将目录下任意.c文件生成其无.后缀的可执行文件(例如hello.c生成hello的可执行文件)的makefie文件。引入各个知识点逐步改良编写的makefile,在这个过程中完全理解makefile基础。

最终makefile文件代码展示(可先跳过,逐步理解后,最后再看一遍)

target = $(patsubst %.c,%,$(wildcard *.c))

ALL:$(target)

%:%.c
	gcc $< -o $@ 

.PHONY:clean 
clean:
	rm -rf $(target)

1.规则   

目标:依赖条件

(一个tab缩进)命令

        1.目标的时间必须晚于依赖条件的时间,否则,更新目录

        2.依赖条件如果不存在,找寻新的规则去产生依赖

第一版makefile文件

通过当前知识与gcc编译相关基础知识,就可以编写指定当前待编译文件和生成文件的简单            makefile文件了

        例:创建一个文件名为makefile的文件,往文件中添加下述内容

hello:hello.c
    gcc hello.c -o hello

      使用make命令即可完成makefile文件的执行,执行结果如下图所示

        

2.ALL

        ALL:指定最终生成的终极目标

不用ALL去指定最终需要生成的目标文件时,makefile默认会以目标的第一个文件为标准。当生成这个文件后,及时后续还有想要生成的目标文件,也不会继续执行,makefile会直接退出。

第二版makefile(防止漏生成目标文件):

ALL:hello

hello:hello.c
    gcc hello.c -o hello

 函数

  1.wildcard

简述:找到当前目录下所有通配符匹配的文件

例:找到当前目录下所有后缀为.c的文件,赋值给src

        src = $(wildcard *.c)

2.patsubst

简述:带模式的字符串替换,将参数3中,包含参数1的部分替换为参数2

例:把src变量里所有后缀为.c的文件替换成.o

obj = $(patsubst %.c,%.o,$(stc))

   

变量     

$@:在规则的命令中,表示规则的目标

$^:在规则的命令中,表示规则的所有依赖条件

$<:在规则的命令中,表示规则的第一个依赖条件。如果将该变量应用在模式规则中,它可将依赖条件列表中的依赖依次取出,套用模式规则(模式规则后续介绍)。

第三版makefile(当前目录下只有一个文件时,可以不需要知道文件名称进行编译):

src=$(wildcard *.c)
target=$(patsubst %.c,%,$(src))

ALL:$(target)

target:src
	gcc $< -o $@ 

模式规则

简述:和规则匹配目标的目标文件和依赖文件会依次执行后续的命令。

%:%.c

        gcc -c $< -o %@

第四版makefile(目录下任意.c文件生成其无.后缀的可执行文件)

target = $(patsubst %.c,%,$(wildcard *.c))

ALL:$(target)

%:%.c
	gcc $< -o $@ 

拓展:静态模式规则

简述:指定变量来匹配这个模式规则,只有当前变量中包含的内容才进行匹配该模式规则

$(obj):%:%.c

        gcc -c $< -o %@

clean:

        简述:清除编译生成的中间文件和最终目标文件

clean:

        rm -rf  $(obj)

第五版makefile(可以清除生成的中间文件和目标文件)

target = $(patsubst %.c,%,$(wildcard *.c))

ALL:$(target)

%:%.c
	gcc $< -o $@ 

clean:
    rm -rf $(target)

伪目标

简述:能够确定执行makefile clean命令,防止当前目录下有clean文件名的文件,导致make clean 命令无法正常执行

.PHONY:clean 

最终版makefile(增加伪目标,防止makefile clean 无法执行清除命令)

target = $(patsubst %.c,%,$(wildcard *.c))

ALL:$(target)

%:%.c
	gcc $< -o $@ 

.PHONY:clean 
clean:
	rm -rf $(target)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值