了解makefile

问题描述 投票:2回答:2

我说的是this question,该人员已使用该任务的Makefile更新了最终解决方案。我很难理解它是如何完成的。

有规则:

$(OBJECTS): $(OBJDIR)/%.o : $(SRCDIR)/%.c
    @$(CC) $(CFLAGS) -c $< -o $@

我无法理解,但是凭直觉我知道它将要做什么。几乎所有其他一切都非常清楚。谢谢!

makefile gnu-make
2个回答
3
投票

这是static pattern rule。第一个字段是目标列表,第二个字段是Make用于隔离目标的“词干”的target pattern,第三个字段是Make用来构造前提列表的prerequisite pattern

假设您有

SRCDIR = src
OBJDIR = obj
OBJECTS = obj/foo.o obj/bar.o obj/baz.o

$(OBJECTS): $(OBJDIR)/%.o : $(SRCDIR)/%.c
    @$(CC) $(CFLAGS) -c $< -o $@

[如果您make obj/foo.o,则Make首先将此规则标识为要使用的规则(因为obj/foo.o在目标列表$(OBJECTS)中),将其与目标模式obj/%.o进行匹配,然后找到词干(该部分通配符%匹配)为foo,然后将其插入先决条件模式src/%.c,然后发现先决条件为src/foo.c

如果您还定义了变量

CC = gcc
CFLAGS = -thisflag -thatflag=something

然后规则中的命令变为

    @gcc -thisflag -thatflag=something -c src/foo.c -o obj/foo.o

((请注意,$<是第一个前提条件,$@是目标名称。)

回答您的另一个问题:是的,makefile可以处理对头文件(x.h)的依赖性,因此,如果头已被修改,Make将重建目标。不,这个makefile不能这样做。您可以手动修改makefile,添加规则,例如

a.o: x.h

假设您知道内含物实际上是什么,或者可以让makefile自动执行,这是您可能不应该尝试的高级技术。


1
投票

[此行说明了如何从源(.c)获取目标文件(.o),它避免了为每个.c文件重复此行。

对象将在OBJDIR中,源将在SRCDIR中

$(CC)将包含编译器,CFLAGS将包含编译器的选项,-c告诉gcc将源代码编译为对象。

例如:

  • CC = gcc

  • CFLAGS = -g -Wall

可以转换成gcc -g -Wall -c test.c -o test.o

© www.soinside.com 2019 - 2024. All rights reserved.