makefile中的变量目标

wme*_*cer 16 makefile gnu-make

我正在尝试编译一组目标.然而它似乎只做第一个.下面是我的makefile的减少,显示错误.

  OBJECTS = abc def ghi
  SOURCES = abc.c def.c ghi.c

  $(OBJECTS):     $(SOURCES)
          @echo target is $@, source is $<
Run Code Online (Sandbox Code Playgroud)

在壳中,

  $ touch abc.c def.c ghi.c
  $ make
Run Code Online (Sandbox Code Playgroud)

当我运行make时,我得到以下输出:

  target is abc, source is abc.c
Run Code Online (Sandbox Code Playgroud)

所以它似乎只是在运行第一个目标.

如果我用$ ^替换$ <,则输出为:

  target is abc, source is abc.c def.c ghi.c
Run Code Online (Sandbox Code Playgroud)

我的问题是,是否可以对变量进行扩展,例如(%:%)模式?

Bet*_*eta 21

试试这个:

  OBJECTS = abc def ghi

  all: $(OBJECTS)

  $(OBJECTS):%:%.c
          @echo target is $@, source is $<
Run Code Online (Sandbox Code Playgroud)

麻烦是

  1. 默认目标(如果你只输入`make`就是Make选择的那个)是makefile中的第一个目标,即`abc`.
  2. 您为每个对象创建了所有源的先决条件.也就是说,这三个来源都是`abc`的先决条件.它们也是`def`和`ghi`的先决条件.

  • @Nebula:[here](http://www.gnu.org/software/make/manual/make.html#Static-Pattern)描述了静态模式规则.规则并不假设Make知道等效的.c文件是什么,它更通用.它表示:对于此列表中的任何目标(`$(OBJECTS)`),取整个目标名称(`%`),并添加".c"(`%.c`)以获取先决条件. (2认同)
  • @KellyBeard:没问题,`$(ZIPS):%.zip:%` (2认同)