2016-07-15 5 views
2

다음 예제 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] 

답변

0

vpath은 필수 구성 요소를 찾는 데에만 사용할 수 있습니다. obj/rw_mod.o이 이미 존재하는 경우

Makefiles rule 3

Use VPATH to locate the sources from the objects directory, not to locate the objects from the sources directory.

그래서 obj/avpar.o에 대한 규칙이 필수 규칙을 조회하는 동안 물건을 앞에 추가되지 않습니다 vpath 실패 rw_mod.o 일치하는 규칙이 없다, 그것은 여기 일하는 것이 유일한 방법이 될 것입니다.

어쨌든 규칙이 정확하지 않을 수 있습니다. 왜 하나의 오브젝트 파일이 다른 파일에 의존할까요?

+0

설명을 추가했습니다. 파일이 존재하지 않기 때문에 그것이 맞을 수도 있습니다. 반면, 파일을 처음 점검 할 때 컴파일 문의 첫 번째 행에는 파일이 없습니다. 그리고 최종 규칙은 확실히 유효합니다, 나는 그것이 'vpath'질문을 고려하지 않고 의존성을 진술하는 아주 표준적인 방법이라고 생각합니다. –

+0

글쎄, 실제로, 당신은 개체 파일이 다른 것에 의존한다고 말하는 것이 이상하다. 문제의 사실은 avpar.o로 컴파일하는 것은 rw_mod.o가 존재할 때만 존재하는 rw_mod.mod 파일이 필요하지만 모듈 파일은 컴파일러 플래그와 별도로 처리되기 때문에 종속성이 있다는 이유가 여기에 있습니다 대신 오브젝트 파일에. –

관련 문제