Makefile学习1——基本格式、变量

本文详细介绍了Makefile的基本语法,包括目标与依赖文件的关系、命令执行条件、注释规则以及多个规则单元的组织。此外,还讲解了Makefile中的变量定义,如替换、追加和恒等于三种赋值方式,并通过实例展示了如何在Makefile中有效使用这些变量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

语法

基本格式
 目标(target)...  :  依赖(prerequiries)
 <tab\> 命令(commad)

  如果“依赖文件”比“目标文件”更加新,那么执行“命令”来重新生成“目标文件”。命令被执行的 2 个条件:依赖文件比目标文件新,或是 目标文件还没生成。

  1. 必须以 Tab 键缩进命令行,不能以空格键缩进;
  2. 多个规则单元之间可以用存在任意空行、TAB空行、空格空行。(这里将由一个目标、一个依赖,一个命令组成的部分称为一个单元);
  3. 命令前可以有多个<TAB>,也可以有空格。但起始必须是<TAB>
  4. 目标和依赖所在行,开头不能有<TAB>,但可以有空格;
  5. 多个文件时,Makefile命令顺序不需要根据执行顺序;
注释
以#注释
# #表示注释
hello.i:hello.c
	gcc -E hello.c -o hello.i

hello.S:hello.i
	gcc -S hello.i -o hello.S

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

hello:hello.o
	gcc hello.o -o hello
第一个目标文件为最终目标

所以上面的Makefile文件应该反向

# #表示注释
# 第一个目标文件为最终目标
hello:hello.o
	gcc hello.o -o hello

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

hello.S:hello.i
	gcc -S hello.i -o hello.S

hello.i:hello.c
	gcc -E hello.c -o hello.i
伪目标

对于不需要依赖文件,只想在Makefile中执行命令时,需要用到伪目标。
伪目标:.PHONY:

# #表示注释
# 第一个目标文件为最终目标
# 伪目标:.PHONY:。不需要目标文件,只执行命令。
hello:hello.o
	gcc hello.o -o hello

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

hello.S:hello.i
	gcc -S hello.i -o hello.S

hello.i:hello.c
	gcc -E hello.c -o hello.i

.PHONY:
clean:
	rm -rf hello.i hello.S hello.o hello

此时,make clean将运行rm -rf hello.i hello.S hello.o hello。

变量

变量定义方式主要包括:= (替换) += (追加) := (恒等于);
应用方式是 $(变量)

替换

利用TAR替换test,后续可以追加。

TAR = test
追加

对于可以追加的变量,采用+=追加。

OBJ = main.o
OBJ += circle.o
OBJ += square.o

这样 $(OBJ) 等同于 main.o circle.o square.o。

恒等于

利用CC来代替gcc,且不能追加。类似于常量定义

CC := gcc

这样,就可以将gcc -c main.c -o main.o,替换成

$(CC) -c main.c -o main.o
# main.c main.h circle.c circle.h square.c square.h
# 变量:= (替换)   += (追加)  := (恒等于)
# 
CC := gcc
TAR = test
OBJ = main.o
OBJ += circle.o
OBJ += square.o

$(TAR):$(OBJ)
	$(CC) $(OBJ) -o $(TAR)

main.o:main.c
	$(CC) -c main.c -o main.o

circle.o:circle.c
	$(CC) -c circle.c -o circle.o

square.o:square.c
	$(CC) -c square.c -o square.o

.PHONY:
cleanall:
	rm -rf $(OBJ) $(TAR)

clean:
	rm -rf $(OBJ)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值