![차이점](https://linux55.com/image/62889/%EC%B0%A8%EC%9D%B4%EC%A0%90.png)
왜 이것이 작동하지 않습니까? VPATH를 제거하거나 "."으로 설정하면 모든 것이 정상입니다. 실행하기 전에 비어 있는 dir
, a.cpp
이 b.cpp
존재합니다.
VPATH=./.
dir/lib.a: dir/a.o dir/b.o
touch $@
x:
touch x
dir/%.o: %.cpp | x
touch $@
답변1
이것은 답변은 아니지만 차이점을 보여주기에는 댓글이 적합하지 않습니다. 이것이 꼭 필요한 중요한 정보입니다.
파일 1 생성:
VPATH=./.
dir/lib.a: dir/a.o dir/b.o
touch $@
x:
touch $@
dir/%.o: %.cpp | x
touch $@
파일 2 생성:
VPATH=.
dir/lib.a: dir/a.o dir/b.o
touch $@
x:
touch $@
dir/%.o: %.cpp | x
touch $@
주목레시피의 접두어 문자는 탭 문자입니다. 내용을 복사해서 붙여넣으시는 경우 주의하시기 바랍니다.
폴더는 ./dir
비어 있고 폴더 안에는 두 개의 파일 ./a.cpp
과 make 파일이 존재합니다../b.cpp
호출 make -f makefile1
오류는 다음과 같습니다.
make: *** No rule to make target `dir/b.o', needed by `dir/lib.a'. Stop.
이를 호출하면 makefile2
예상된 결과가 제공되며 오류는 보고되지 않습니다.
makefile1.log
make 실행시 데이터베이스를 출력할 때 와 차이점은 다음과 같습니다 makefile2.log
.
--- /dev/fd/63 2015-04-13 18:31:30.370203634 +0000
+++ /dev/fd/62 2015-04-13 18:31:30.370203634 +0000
@@ -1,5 +1,7 @@
touch x
touch dir/a.o
+touch dir/b.o
+touch dir/lib.a
<D = $(patsubst %/,%,$(dir $<))
?F = $(notdir $?)
CWEAVE = cweave
@@ -99,7 +101,7 @@
SSH_CLIENT = ...
MAIL = /var/mail/user
LEX.l = $(LEX) $(LFLAGS) -t
-VPATH = ./.
+VPATH = .
+D = $(patsubst %/,%,$(dir $+))
COMPILE.r = $(FC) $(FFLAGS) $(RFLAGS) $(TARGET_ARCH) -c
TMUX = /tmp/tmux-1000/default,3455,0
@@ -282,6 +284,8 @@
$(GET) $(GFLAGS) $(SCCS_OUTPUT_OPTION) $<
%:: SCCS/s.%
$(GET) $(GFLAGS) $(SCCS_OUTPUT_OPTION) $<
+dir/lib.a: dir/a.o dir/b.o
+ touch $@
.web.p:
$(TANGLE) $<
.l.r:
@@ -297,6 +301,8 @@
$(RM) y.tab.c
.o:
$(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@
+x:
+ touch $@
.y:
.def.sym:
$(COMPILE.def) -o $@ $<
@@ -331,8 +337,6 @@
$(COMPILE.r) $(OUTPUT_OPTION) $<
.r:
$(LINK.r) $^ $(LOADLIBES) $(LDLIBS) -o $@
-dir/a.o: a.cpp | x
- touch $@
.info:
.elc:
.l.c:
@@ -344,7 +348,6 @@
$(LINK.C) $^ $(LOADLIBES) $(LDLIBS) -o $@
.r.f:
$(PREPROCESS.r) $(OUTPUT_OPTION) $<
-dir/b.o:
.S:
$(LINK.S) $^ $(LOADLIBES) $(LDLIBS) -o $@
.texinfo.info:
@@ -359,6 +362,7 @@
$(COMPILE.s) -o $@ $<
.s:
$(LINK.s) $^ $(LOADLIBES) $(LDLIBS) -o $@
+b.cpp:
.texinfo.dvi:
$(TEXI2DVI) $(TEXI2DVI_FLAGS) $<
.el:
@@ -372,6 +376,8 @@
$(MAKEINFO) $(MAKEINFO_FLAGS) $< -o $@
.DEFAULT:
.h:
+dir/a.o: a.cpp | x
+ touch $@
.tex.dvi:
$(TEX) $<
.cpp.o:
@@ -384,10 +390,10 @@
.texi:
.txinfo:
.tex:
+dir/b.o: b.cpp | x
+ touch $@
.txinfo.info:
$(MAKEINFO) $(MAKEINFO_FLAGS) $< -o $@
-dir/lib.a: dir/a.o dir/b.o
- touch $@
.ch:
.S.s:
$(PREPROCESS.S) $< > $@
@@ -398,8 +404,6 @@
.F.f:
$(PREPROCESS.F) $(OUTPUT_OPTION) $<
.w:
-x:
- touch $@
.S.o:
$(COMPILE.S) -o $@ $<
.F:
이는 다음 명령을 사용하여 검색됩니다.
$ /usr/bin/diff <(grep -vE '(^#|makefile1|^\s*$)' makefile1.log) <(grep -vE '(^#|makefile2|^\s*$)' makefile2.log)
차이점
실제 차이점은 makefile2에 가짜 대상이 있고 b.cpp
다음 내용이 포함되어 있다는 것입니다.
touch dir/b.o
touch dir/lib.a
dir/b.o
규칙도 둘 사이에 매우 다릅니다.