Makefile 自动变量

Makefile中,大家经常会见到类似$@、$^、$<这种类型的变量。这种变量一般称为自动变量,自动变量是局部变量,作用域范围在当前的规则内,它们分别代表不同的含义:

  • $@:目标
  • $^:所有目标依赖
  • $<:目标依赖列表中的第一个依赖
  • $?:所有目标依赖中被修改过的文件

有了这些自动变量,我们就可以改进下面的Makefile

.PHONY: clean

CC  = gcc
BIN = a.out
OBJS = hello.o
OBJS += module.o

$(BIN): $(OBJS)
    @echo "start compiling..."
    @echo $(OBJS)
    $(CC) -o $(BIN) $(OBJS)
    @echo "compile done"

hello.o: hello.c
    $(CC) -c -o hello.o hello.c
module.o: module.c
    $(CC) -c -o module.o module.c

clean:
    rm -f $(BIN) $(OBJS)

将这个Makefile中命令行中的目标和目标依赖分别使用$@和$^代替,Makefile就变成了下面的样子:

.PHONY: clean

CC  = gcc
BIN = a.out
OBJS = hello.o module.o

$(BIN): $(OBJS)
    @echo "start compiling..."
    @echo $(OBJS)
    $(CC) -o $@ $^
    @echo "compile done"

hello.o: hello.c
    $(CC) -c -o $@ $^
module.o: module.c
    $(CC) -c -o $@ $^

clean:
    rm -f $(BIN) $(OBJS)

除了上面几个常用的自动变量外,还有一些自动变量不太常用,但是大家在以后阅读Makefile时可能会遇到,比如:

  • $%:当规则的目标是一个静态库文件时,$%代表静态库的一个成员名
  • $+:类似$^,但是保留了依赖文件中重复出现的文件
  • $*:在模式匹配和静态模式规则中,代表目标模式中%的部分。比如hello.c,当匹配模式为%.c时,$*表示hello
  • $(@D):表示目标文件的目录部分
  • $(@F):表示目标文件的文件名部分
  • $(*D):在模式匹配中,表示目标模式中%的目录部分
  • $(*F):在模式匹配中,表示目标模式中%的文件名部分
  • -: :告诉make在编译时忽略所有的错误
  • @: :告诉make在执行命令前不要显示命令
  • $::
《Makefile工程实践》视频教程,一线开发工程师独家录制,网上首家讲解Makefile的实战课程。从零开始,教你一步一步编写一个工程项目的Makefile,支持使用第三方静态库、动态库,支持指定模块或目录编译生成静态库、动态库,赠送企业级的Makefile模板,学完即可拿来使用,投入项目开发实战,具备独立开展项目开发和管理的能力。详情请点击淘宝链接:Linux三剑客