我想用簡單的三個文件來學習make
。Makefile第一個規則目標
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,一切都正常運行
的makefile
CC = gcc
CFLAGS = -I.
DEPS = foo.h
OBJ = foo.o main.o
.PHONY: clean
main: $(OBJ)
gcc -o [email protected] $^ $(CFLAGS)
%.o: %.c $(DEPS)
$(CC) -c -o [email protected] $< $(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 [email protected] $^ $(CFLAGS)
%.o: %.c $(DEPS)
$(CC) -c -o [email protected] $< $(CFLAGS)
以上的makefile調用make
因爲make
默認運行的第一條規則只運行make clean
。
問題是與此生成的文件
CC = gcc
CFLAGS = -I.
DEPS = foo.h
OBJ = foo.o main.o
.PHONY: clean
%.o: %.c $(DEPS)
$(CC) -c -o [email protected] $< $(CFLAGS)
main: $(OBJ)
gcc -o [email protected] $^ $(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的地方。
大概規則是第一個*特定*目標將被制定。像'%.o:%.c $(DEPS)'這樣的隱式模式規則不會指定特定的目標。 –
@j_random_hacker但是模式不是一個有效的目標。所以如果我要使用一個只使用上述模式構建目標文件的makefile,那麼'make'期望什麼都不應該發生,是不是很奇怪? –
@j_random_hacker是的,如果我只指定了模式,那麼'make'說「make:***沒有目標,停止。「 –