2011-04-11 3 views
3

오브젝트 파일을 자동으로 목록을 대체 명령을합니다GNU는 메이크의 일반적인 유형이 같은 라인을 가지고

OBJS=something.o other.o third.o progname.o 

progname: $(OBJS) 

는 그런 다음 make progname를 실행하는 것입니다. 그러나 GNU Make는 현재 디렉토리에서 볼 수있는 모든 c- 파일들로부터 o- 파일 자체의 목록을 생성 할 수 있습니다. 어떻게 이뤄지나요?

기본적으로 makefile을 변경하지 않고도 C 파일을 디렉토리에 추가 할 수 있기를 원합니다.

(일부 쉘 마법을 통해 예를 들어를, 아니면? 이것에 대한 내장 함수가있다)

답변

3

정의 된 모든 규칙 (암시 적 규칙 포함)을 보려면 make -p을 실행하십시오.

그러나 make가 소스 파일에서 오브젝트 파일을 생성하는 방법을 알고 있다고해서 그것이 이어야 함을 의미하지 않습니다.해야합니다. Make는 빌드를 요구하는 목표를 충족시키기 위해 최소한의 작업 만 시도합니다.

당신은 당신이 모든 개체에 따라 달라집니다 규칙, 예를 들어 필요합니다 현재 디렉토리에있는 객체로 모든 소스를 컴파일 할 수 있도록하려면 다음

all: $(patsubst %.c,%.o,$(wildcard *.c)) 
+1

나는 자유로이 '셸 ls * .c'에서 '와일드 카드 * .c'로 바뀌었다. –

+0

감사합니다. @Amigable Clark Kant, 실제로'$ (shell ls) '은 그것을하는 추악한 방법이며, 여러분의 솔루션은 확실히 깨끗합니다. –

+0

내 질문에 답변 해 주셔서 감사합니다. :-) –

1

당신은 당신에게 파일의 목록을 제공하는 쉘 명령을 확장 할 수 있습니다. implicit rules을 사용할 수도 있습니다.

+0

확인을 위해, 어떻게 완성할까요? –

+0

그 페이지의 문서를 봐야 할 것입니다. 기본적인 아이디어는''make ''가 많은 "표준"프로그램을위한 소스로부터 특정 바이너리를 만드는 법을 "안다"는 것이다. 이 지식을 사용하여 간단히 "이것은 목표입니다 - 적절하게 명명 된 소스에서 빌드하십시오"라고 말할 수 있습니다. make를 사용한 이후 3 년이 넘었고 내 머리에서 바꿔 놨기 때문에 예제를 줄 수는 없습니다. –

0

는 다음과 같이 수행 할 수 있습니다

$(ODIR)/%.o: %.cpp 
    $(CC) -c $(CFLAGS) -o [email protected] $< 

make가 현재 디렉토리에있는 .cpp 파일 이름에서 .o 인 파일 이름을 생성합니다.

+0

예를 들어 주셔서 감사합니다. :) –

+0

하지만 그 규칙은 이미 존재하지 않습니까? –

+0

@Amigable Clark Kant : 아니요, 당신이 직접 정의하겠습니다. – weekens

3

그것은 또한 다음과 같이 수행 할 수 있습니다

를 거기에 main()와 오브젝트 파일이 "progname.o"인 경우 잘 작동
SRCS = $(wildcard *.c) 
OBJS = $(SRCS:.c=.o) 

progname: $(OBJS) 

.

관련 문제