make
은 세 개의 파일 만 사용하여 배우려고합니다. 나는 다음과 같은 makefile을 사용하는 경우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;
}
, 다 잘
메이크
를 실행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
이 첫 번째 대상 (기본적으로 모든 곳에서 읽음)을 실행하기 때문에 작동합니다. 기본적으로 make
은 첫 번째 규칙을 실행하기 때문에
내가 위 메이크에 make
를 호출 아래 메이크
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)
를 사용하는 경우에만 make clean
실행됩니다.
문제는 내가 그 첫 번째 대상이기 때문에
gcc -c -o foo.o foo.c -I.
gcc -c -o main.o main.c -I.
gcc -o main foo.o main.o -I.
왜 그냥 .o
파일을 구축하고 멈추지 make
않습니다 얻을 make
를 사용하여 위 메이크에서이 메이크
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
함께 왜 메인을 구축 할 수 있을까요? main을 빌드하는 첫 번째 규칙에서 지정한 부분이 없습니다.
아마도 첫 번째 * 특정 * 목표가 작성된다는 규칙이있을 것입니다. '% .o : % .c $ (DEPS)'와 같은 암시적인 패턴 규칙은 특정 대상을 지정하지 않습니다. –
@j_random_hacker 패턴이 유효한 대상이 아닙니다.? 그래서 위의 패턴을 사용하여 오브젝트 파일 만 빌드하는 makefile을 사용한다면,'make'는 아무 일도 일어나지 않을 것으로 예상합니다. 이상하지 않습니까? –
@j_random_hacker 예, 패턴 만 지정하면 'make :'는 'make : *** No targets, Stop." –