makefile 자동 생 성 의존 관계

수 동 작성 의존 관 계 는 작업량 이 많 을 뿐만 아니 라 누락 되 기 쉬 울 뿐만 아니 라 업데이트 도 제때에 하기 어렵 습 니 다. 원본 이나 헤더 파일 을 수정 한 후에 Makefile 은 수정 을 잊 을 수 있 습 니 다.이 문 제 를 해결 하기 위해 서 는 대상 파일 과 원본 파일 의 의존 관 계 를 gcc 옵션 으로 자동 으로 생 성 할 수 있 습 니 다.-M 옵션 은 포 함 된 시스템 헤더 파일 과 포 함 된 다른 시스템 헤더 파일 도 찾 을 수 있 습 니 다. 시스템 헤더 파일 의 의존 관 계 를 출력 할 필요 가 없 을 때 -M 옵션 을 사용 할 수 있 습 니 다.
다음은 의존 관 계 를 자동 으로 생 성 하 는 방법 을 간단 한 예 로 설명 한다.
exm/
     main.c
     s.c
     s.h
makefile 파일 내용 은 다음 과 같 습 니 다:
all:a
src=$(wildcard *.c)
obj:=$(patsubst %.c,%.o,$(src))
ifneq($(MAKECMDGOALS),clean)
-include$(src:.c=.d)
endif
a:$(obj)
gcc$(obj)-o $@
%.d:%.c
set-e;rm -f $@;\
gcc-MM$(CPPFLAGS) $< > $@.$$$$;\
sed's,\($*\)\.o[:]*,\1.o $@ : ,g' < $@.$$$$ > $@;\
rm-f$@.$$$$
%.o:%.c
@echo'Buildingfile: $<'
@echo'Invoking:GCC C Compiler'
gcc-O0-g3 -Wall -c -o "$@""$<"
@echo'Finishedbuilding: $<'
@echo''
그 중에서 wildcard 역할 은 지정 한 디 렉 터 리 에서 c 파일 을 모두 찾 는 것 입 니 다. 그래서 여기 src = main. cs. c
patsubst 역할 은 $(src) 의 c 를 모두 o 로 바 꾸 는 것 입 니 다. 그래서 obj = main. os. o
include $(src: c = d) 는 includemain. ds. d 에 해당 합 니 다.
이 두 파일 이 존재 하지 않 기 때문에 다음 알림 이 나타 납 니 다.
makefile: 6: main. d: 그 파일 이나 디 렉 터 리 가 없습니다.
makefile: 6: s. d: 그 파일 이나 디 렉 터 리 가 없습니다.
이 힌트 를 원 하지 않 으 면 include 를 - include 로 바 꿀 수 있 습 니 다.
처음에는 -MM 파일 을 찾 지 못 했 지만 .d 경 고 를 할 것 이다.그러나 makemake 의 파일 이름 도 목표 로 업 데 이 트 를 시도 하 는데 이런 목 표 는 모델 규칙 include 을 적용 한다.%.d:%c Makefile , , make Shell 5 ; , , \ 。 : 1)set-e Shell : , 。 @ makefile 원래 2) .d 를 지 워 라.
3) $< 의존 하 는 대상 집합 (즉 *. c), - MM: 파일 의존 관계 생 성 을 의미 합 니 다. $@: 생 성 된 대상 파일 (즉 *. d) 을 의미 합 니 다. $$: 자체 ProcessID 를 의미 합 니 다.Makefile 에서 특별한 의미 가 있 습 니 다. 글자 의 뜻 을 표시 하려 면 두 개의 $를 써 야 합 니 다. 따라서 Makefile 의 네 개의 $는 Shell 에 두 개의 $로 전 달 됩 니 다. 두 개의 $는 Shell 에서 현재 프로 세 스 의 id 를 표시 합 니 다. 보통 임시 파일 에 이름 을 지어 서 문서 의 이름 이 유일 하도록 합 니 다.
4) 이 $ 명령 은 비교적 복잡 하 므 로 자세히 말 하지 않 는 다. 주요 역할 은 교 체 를 찾 고 d 의 의존 관 계 를 추가 하 는 것 이다.
5) 마지막 으로 임시 서 류 를 삭제 합 니 다.sed Makefile make make Makefile main.d stack.d maze.d , , Makefile main.omain.d : main.c s.h s.os.d : s.c s.h , , makefile .d .d make makefile .d
위의 방법 외 에 GCC 의 - MD - MP - MF - MT 옵션 을 사용 할 수 있 습 니 다. 다음 과 같이 같은 목적 을 가 질 수 있 습 니 다.
all:a
src=$(wildcard *.c)
obj:=$(patsubst %.c,%.o,$(src))
ifneq($(MAKECMDGOALS),clean)
-include$(src:.c=.d)
endif
a:$(obj)
gcc$(obj)-o $@
%.o:%.c
@echo'Buildingfile: $<'
@echo'Invoking:GCC C Compiler'
gcc-O0-g3 -Wall -c -fmessage-length=0 -MMD -MP-MF"$(@:%.o=%.d)"-MT"$(@:%.o=%.d)"-o "$@""$<"
@echo'Finishedbuilding: $<'
@echo''

좋은 웹페이지 즐겨찾기