2011-01-24 3 views
2

필자가 호출 할 때마다 라이브러리와 실행 파일을 다시 링크하는 것처럼 보이는 복잡한 makefile이 있습니다. 나는 간단한 메이크에 문제를 좁힐 수 있었다 :.PHONY가이 상황에서 작동하지 않는 이유는 무엇입니까?

어떤 이유
1: all: prog 
2: 
3: .PHONY: prog 
4: prog: prog.exe 
5: 
6: prog.exe: lib prog.o 
7:   touch prog.exe 
8: 
9: prog.o: prog.c 
10:   touch prog.o 
11: 
12: .PHONY: lib 
13: lib: lib.so 
14: 
15: lib.so: lib.o 
16:   touch lib.so 
17: 
18: lib.o: lib.c 
19:   touch lib.o 
20: 
21: .PHONY: clean 
22: clean: 
23:   rm *.so *.o *.exe 

,이 예 prog.exe이 때마다 생성됩니다. 6 행의 lib를 lib.so로 바꾸면 작동합니다. 그러나 내가 여기서 시도하고있는 것을 할 수 있어야하는 것처럼 보인다. 내가 누락 된 근본적인 것이 있습니까? 온라인 GNU 수 있도록 매뉴얼에서

답변

5

: 포니 타겟은 실제 타겟 파일의 전제 조건 안

; 이라면 그 레시피가 매번 실행됩니다. time make는 그 파일을 갱신합니다. 가짜 대상이 지정된 목표 (목표를 지정 에 인수 참조) 인 경우에만 가짜 대상이 실제 대상의 전제 조건 결코 한 으로, 가짜 대상 조리법 실행됩니다.

적어도 당신이보고있는 것을 설명합니다. prog.exelib에 따라 달라 지므로 라이브러리 수집을위한 사용자의 허위 목표 인 lib 규칙이 실행되고 따라서 prog.exe은 "오래됨"이며 다시 연결됩니다.

당신의 의존성에 대해 더 분명히해야 할 것처럼 보입니다. 아마도 여러 라이브러리를 좀 더 쉽게 관리 할 수 ​​있도록 변수에 넣는 것이 좋을까요? 예를 들어 위의 예에서

LIBS = lib.so 

all: libs progs 

.PHONY: progs libs clean 

progs: prog.exe 

prog.exe: $(LIBS) prog.o 
    touch prog.exe 

# etc. 
libs: $(LIBS) 

lib.so: lib.o 
    touch lib.so 

# and so on 

, 나 또한 내 경험에 더 일반적 progslibs에 가짜 대상의 이름을 변경했습니다. 이 경우 libs 대상은 실제 종속성으로 작동하는 것이 아니라 모든 라이브러리를 작성하는 데 편리합니다.

+0

나는 그들이 당신을 그렇게하기를 바란다. 내 makefile을 사용하면 "고객"이 lib * .so없이 다른 라이브러리에 대한 종속성을 지정할 수 있습니다. 따라서 MyLib1과 MyLib2에 의존하는 MyProg라는 exe를 갖고 있다면 "LIB_FILES : = MyLib1 MyLib2"보다는 "LIB_FILES : = /libMyLib1.so /libMyLib2.so"라고 말하면됩니다. 나는 이것이 작동 할 수 있도록 libs의 실제 이름과 위치를 저장해야한다고 생각한다. 응답 주셔서 감사합니다! – user545226

+0

"답변을 수락하는 방법"은 무엇입니까? 또한, 위쪽 화살표를 클릭하려고했지만 15 개의 평판이 필요하다고 말합니다. 나는 이곳에서 새로운 사람이기 때문에 나는이 사이트에서 평판이 좋지 않은 사람이라고 생각한다. : – user545226

+0

upvote 일에 관해서는, 당신이 질문을 upvoting 같은 더 많은 일을 할 수있을거야 더 많은 평판 포인트를 얻을. 나는 자주 묻는 질문을 읽는 것이 좋습니다 (모든 페이지 상단에 링크가 있습니다) –

관련 문제