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
경 고 를 할 것 이다.그러나 make
는 make
의 파일 이름 도 목표 로 업 데 이 트 를 시도 하 는데 이런 목 표 는 모델 규칙 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''
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
ZSH에서 물고기까지ZSH는 수년 동안 내 기본 셸이었습니다. 이제 몇 달 동안 사용하면서 ZSH 구성에 대해 몇 가지 사항을 발견했습니다. 우리는 을 제공하는 시스템과 더 빨리 상호 작용하는 경향이 있습니다. 내.zshrc 구성에는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.