【问题标题】:How to use a variable list as a target in a Makefile?如何在 Makefile 中使用变量列表作为目标?
【发布时间】:2010-12-01 01:21:28
【问题描述】:

假设我正在处理一个 makefile,并且我在顶部有以下变量声明:

FILES = file1.cpp file2.cpp file3.cpp

现在假设我想用一个特殊的命令编译每一个,而不像这样指定每个目标:

file1.o : file1.cpp
    custom_command file1.cpp
file2.o : file2.cpp
    custom_command file2.cpp
file3.o : file3.cpp
    custom_command file3.cpp

有没有更好的方法来使用我在上面声明的$(FILES) 变量?

类似:

$(FILES:.cpp=.o) : $(FILES)
    custom_command $(FILES)

...只需要对$(FILES) 变量中的每个文件执行此操作。

【问题讨论】:

    标签: arrays variables makefile target


    【解决方案1】:

    是的。有所谓的模式规则。一个例子是最容易理解的:

    %.o: %.cpp
           $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@
    

    (记住 Makefiles 需要标签)。此规则描述了如何从 cpp 文件生成目标文件。

    如果你不想要这么宽泛的规则,你可以使用所谓的静态模式:

    objects = file1.o file2.o file3.o
    
    all: $(objects)
    
    $(objects): %.o: %.cpp
            $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@
    

    这是 GNU Make 手册中关于 static pattern rulespattern rules 的部分。

    【讨论】:

      【解决方案2】:

      可以按照以下方式进行操作:

      SRCS=a.c b.c
      OBJS=$(SRCS:.c=.o)
      
      $(OBJS): $(SRCS)
              cc -c -o a.o a.c
              cc -c -o b.o b.c
      

      但您必须记住,依赖项是完整的 - 它假定 a.o 也依赖于 b.c,但情况可能并非如此。

      您可能追求的是关于如何将一种文件类型转换为另一种文件类型的单一规则:

      SRCS=a.c b.c
      OBJS=$(SRCS:.c=.o)
      
      all: $(OBJS)
      
      .c.o:
              gcc -c -o $@ $<
      

      .c.o 就是这样一条规则,它规定了运行哪些命令来将.c 文件转换为.o 文件。在实际命令中,$@ 替换为具体目标,$&lt; 替换为第一个先决条件的名称。

      您可以使用许多其他自动变量,如果您没有可用的info 资料,请使用info make 查找它们或寻找一本关于make 的好书。

      【讨论】:

      • 是的,这就是我想要做的。
      • 另一种精确指定依赖关系的方法是使用 secondary expansion 的先决条件(GNU Make 特定功能)。
      • 仅供参考-对于任何寻找文档的人-.c.o 规则在 GNU-make 的用语中称为suffix rule。 GNU-make 建议使用模式规则而不是后缀规则。
      【解决方案3】:
      SRCS = a.c b.c
      OBJS = $(SRCS:.c=.o)
      
      .c.o:
              ${CC} ${CFLAGS} -c -o $@ $<
      

      虽然$&lt; 不是很便携(IIRC,bsdmake 的含义是 $^$&lt; 完全交换为 gmake 使用的),但这是 .c.o 的默认配方,它将在任一实现。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多