Makefile第一个规则目标

Kar*_*and 0 c c++ makefile

我正在尝试make使用简单的三个文件.

foo.h中

#ifndef __foo_H_
#define __foo_H_

void print();

#endif
Run Code Online (Sandbox Code Playgroud)

foo.c的

#include <stdio.h>
#include "foo.h"


void print()
{
    printf("Hello World !");
}
Run Code Online (Sandbox Code Playgroud)

main.c中

#include "foo.h"

int main()
{
    print();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我使用以下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
Run Code Online (Sandbox Code Playgroud)

上面的工作是因为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)
Run Code Online (Sandbox Code Playgroud)

调用make上面的makefile只会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
Run Code Online (Sandbox Code Playgroud)

在上面的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.
Run Code Online (Sandbox Code Playgroud)

为什么不make只是构建.o文件并停止,因为它是第一个目标,为什么它继续构建main?我没有在第一条规则中指定构建main的地方.

Mad*_*ist 5

"第一个目标"规则仅计算明确的目标.它不计算隐式目标,例如后缀规则或模式规则.

考虑一下:如何确定它应该构建.o文件?它.o应该构建哪些文件?如何理解它应该在变量中构建变量OBJ,而不是任何其他变量?