【发布时间】:2014-03-31 16:18:30
【问题描述】:
我正在尝试仅使用三个文件来学习 make。
foo.h
#ifndef __foo_H_
#define __foo_H_
void print();
#endif
foo.c
#include <stdio.h>
#include "foo.h"
void print()
{
printf("Hello World !");
}
main.c
#include "foo.h"
int main()
{
print();
return 0;
}
当我使用以下 makefile 时,一切正常
制作文件
CC = gcc
CFLAGS = -I.
DEPS = foo.h
OBJ = foo.o main.o
.PHONY: clean
main: $(OBJ)
gcc -o $@ $^ $(CFLAGS)
%.o: %.c $(DEPS)
$(CC) -c -o $@ $< $(CFLAGS)
clean:
rm *.o
上面的工作是因为make 默认运行第一个目标(我基本上到处都读过)。
如果我使用下面的makefile
CC = gcc
CFLAGS = -I.
DEPS = foo.h
OBJ = foo.o main.o
.PHONY: clean
clean:
rm *.o
main: $(OBJ)
gcc -o $@ $^ $(CFLAGS)
%.o: %.c $(DEPS)
$(CC) -c -o $@ $< $(CFLAGS)
在上述 makefile 上调用 make 仅运行 make clean,因为默认情况下 make 运行第一条规则。
问题在于这个makefile
CC = gcc
CFLAGS = -I.
DEPS = foo.h
OBJ = foo.o main.o
.PHONY: clean
%.o: %.c $(DEPS)
$(CC) -c -o $@ $< $(CFLAGS)
main: $(OBJ)
gcc -o $@ $^ $(CFLAGS)
clean:
rm *.o
在上面的makefile中使用make我得到了
gcc -c -o foo.o foo.c -I.
gcc -c -o main.o main.c -I.
gcc -o main foo.o main.o -I.
为什么make 不只是构建.o 文件并停止,因为它是第一个目标,为什么它还要继续构建main?我在第一条规则中没有指定构建 main 的位置。
【问题讨论】:
-
大概的规则是第一个特定的目标将被制作。像
%.o: %.c $(DEPS)这样的隐式模式规则没有指定特定的目标。 -
@j_random_hacker 但是该模式不是有效目标吗?因此,如果我要使用仅使用上述模式构建目标文件的 makefile,那么
make预计不会发生任何事情,这不是很奇怪吗? -
@j_random_hacker 是的,如果我只指定模式,那么
make会说“制作:*** 没有目标。停止。” -
隐式模式规则未指定目标。它只能匹配并因此应用于已经以其他方式指定的目标——通过“普通”目标规则,或在
make命令行上指定的目标,或作为依赖于其中之一。 (想象一下,如果你唯一的规则以%.o: %.c $(DEPS)开头——make怎么知道用什么替换%?应该用yabbadabbadoo替换它吗?)