一个简单的Makefile示例

#以下通过一个简单的示例说明Makefile的基本语法,以#号开头的表示批注
#以下为变量定义
ASM := nasm
CC := gcc
LD := ld
ASMFLAGS := -f elf
CFLAGS := -c
LDFLAGS := -s
#注:以上这些变量都是隐式规则中的变量,可以不用自己定义
BIN := foobar
OBJS := foo.o bar.o
#可以调用常用函数来定义变量,如字符串替换函数
#SRC:=pmtest5.asm
#BIN:=$(subst .asm,.bin,$(SRC))


#以下说明以下伪目标之间的依赖性
.PHONY :all realclean everything  final
#.PHONY显式的指明all等是伪目标,而伪目标的特点是一定会被执行
all : realclean everything
everything : $(BIN)
final : all clean


#all表示编译所有的内容,是执行make时默认的目标

#clean 表示清除所有目标文件

#realclean 表示清除所有文件

#以下为正式程序

clean :
rm -f $(OBJS)

realclean :

rm -f $(OBJS) $(BIN)


$(BIN) : $(OBJS)

$(LD) $(LDFLAGS) -o $(BIN) $(OBJS)

#以上面这个例子来说明Makefile的基本组成单位:规则,其写法如下

#target:prerequisite

#command

#target表示目标,prerequisite表示当前目标依赖的文件,command表示命令

#真实命令必须以Tab键开头,我写完一保存tab键就没了,大家写的时候一定要注意

#加Tab键

#target依赖于$(OBJS),当target不是伪目标时,make会自动比较目标文件和源文件的
#新旧程度,只有当$(OBJS)中至少有一个文件比target新时,command才被执行

foo.o : foo.asm

$(ASM) $(ASMFLAGS) -o $@ $<

#像$@,$<这种变量称为自动变量,类似于C语言中的局部变量只在本目标内有效

#$@:表示当前目标,在上面这个例子其为foo.o

#$<表示当前目标依赖的第一个文件,在上面这个例子其为foo.asm

#再说一下nasm,gcc等的标准格式,如下:

#GCC   选项参数(可有多个,以空格隔开)   输出文件(只有一个)   源文件(可有多个)

bar.o: bar.c

$(CC) $(CFLAGS) -o $@ $<

#其实上面这条规则可以不写,因为Makefile的隐式规则会自动推导bar.o这个目标的依赖

#目标和生成命令

#make会在自己的隐式规则库中寻找可以使用的规则,若找不到。便会报错,在这个例

#子中,make调用的隐式规则是把*.o目标的依赖文件置成*.c文件,并用GCC的编译命令

#来生成*.o目标文件

#而在上面这个规则中make调用的隐式规则是

#%.o :%.c

#$(CC) $(CFLAGS) -o $@ $<


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值