다음 예제 makefile은 예상대로 작동하며 vpath
을 사용하여 개체 파일과 원본 파일을 찾습니다. 하지만 마지막 줄에서 하나의 객체 파일이 다른 파일에 종속되어 있다고 말하면, 사전 요구 사항 파일의 $(objd)/
디렉토리를 지정해야합니다. 그렇지 않으면 오류가 발생합니다 (코드 아래의 오류 메시지 참조). 마지막 줄에 vpath
지시어가 부족한 이유는 무엇입니까? 행의 마지막 라인을 변경한다'vpath'지시어를 만드십시오. 왜이 전제 조건으로는 충분하지 않습니까?
# Program Name
prog = avpar
#dirs
objd=obj
modd=mod
# extra places to search for prerequisites
vpath %.f90 ../modules
vpath %.o obj/
# etc
FC = gfortran
flags = -I$(modd) -J$(modd) #-fopenmp
obj_files = $(prog).o rw_mod.o
# compile
p$(prog): $(obj_files)
$(FC) $(flags) $^ -o [email protected]
$(objd)/%.o: %.f90
$(FC) $(flags) -c $< -o [email protected]
$(objd)/$(prog).o: $(objd)/rw_mod.o
: 그것은 않는 마지막 라인이 양식
make: *** No rule to make target 'rw_mod.o', needed by 'obj/avpar.o'. Stop.
EDIT :
$(objd)/$(prog).o: rw_mod.o
오류를 범 디렉토리 지정 없이도 작동합니다.
#compile
p$(prog): $(obj_files)
$(FC) $(flags) $^ -o [email protected]
$(objd)/rw_mod.o: rw_mod.f90
$(FC) $(flags) -c $< -o [email protected]
$(objd)/$(prog).o: $(prog).f90 rw_mod.o
$(FC) $(flags) -c $< -o [email protected]
설명을 추가했습니다. 파일이 존재하지 않기 때문에 그것이 맞을 수도 있습니다. 반면, 파일을 처음 점검 할 때 컴파일 문의 첫 번째 행에는 파일이 없습니다. 그리고 최종 규칙은 확실히 유효합니다, 나는 그것이 'vpath'질문을 고려하지 않고 의존성을 진술하는 아주 표준적인 방법이라고 생각합니다. –
글쎄, 실제로, 당신은 개체 파일이 다른 것에 의존한다고 말하는 것이 이상하다. 문제의 사실은 avpar.o로 컴파일하는 것은 rw_mod.o가 존재할 때만 존재하는 rw_mod.mod 파일이 필요하지만 모듈 파일은 컴파일러 플래그와 별도로 처리되기 때문에 종속성이 있다는 이유가 여기에 있습니다 대신 오브젝트 파일에. –