GNU make 是否将 .c 文件隐式编译为 .o 文件?

Does GNU make implicitly compile .c files to .o files?

菜鸟问题。我想用目标文件 foo.obar.c 编译为可执行文件 bar. 我在 Makefile 中有这个:

bar: foo.o 
    cc bar.c foo.o -o bar

我运行 $ make -n 得到:

cc    -c -o foo.o foo.c 
cc bar.c foo.o -o bar

我正在查看输出的第一行 cc -c -o foo.o foo.c。我没有编写明确的规则将 foo.c 编译为 foo.omake 是否在看到 .o 目标时隐式执行此操作?

是的,GNU make 有 catalog 条 built-in 条规则:

Compiling C programs
n.o is made automatically from n.c with a recipe of the form ‘$(CC) $(CPPFLAGS) $(CFLAGS) -c’.

Linking a single object file
n is made automatically from n.o by running the linker (usually called ld) via the C compiler. The precise recipe used is ‘$(CC) $(LDFLAGS) n.o $(LOADLIBES) $(LDLIBS)’.

所以你可以写:

bar: bar.o foo.o