我说的是this question,该人员已使用该任务的Makefile更新了最终解决方案。我很难理解它是如何完成的。
有规则:
$(OBJECTS): $(OBJDIR)/%.o : $(SRCDIR)/%.c
@$(CC) $(CFLAGS) -c $< -o $@
我无法理解,但是凭直觉我知道它将要做什么。几乎所有其他一切都非常清楚。谢谢!
这是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自动执行,这是您可能不应该尝试的高级技术。
[此行说明了如何从源(.c)获取目标文件(.o),它避免了为每个.c文件重复此行。
对象将在OBJDIR中,源将在SRCDIR中
$(CC)将包含编译器,CFLAGS将包含编译器的选项,-c告诉gcc将源代码编译为对象。
例如:
CC = gcc
CFLAGS = -g -Wall
可以转换成gcc -g -Wall -c test.c -o test.o