2012-03-02 6 views
1

저는 이전에 사용했던 다른 메이크 파일을 약간 수정했습니다. 내 변수 ${CXXOPTS}.c.o 메이크 파일 규칙에 사용되지 않지만 이상한 문제가 있습니다. 내가 makefile을 실행할 때 이것은 실행될 것으로 예상 될 때 g++ -c -o SeqPrep2.o SeqPrep2.cpp이 실행되는 것이다 : g++ -Iseqan-03-02-2012 -c -o SeqPrep2.o SeqPrep2.cpp. Makefile 변수가 무시됩니다.

내가 .cpp.o.c.o 변경 :

L=-lm -lz 
SEQANINC=seqan-03-02-2012 
DESTDIR=$(HOME)/ 
BINDIR=bin 
CXXOPTS=-I${SEQANINC} 
CXX=g++ 
A=SeqPrep2 
USEROPTS= 
O=$(patsubst %.cpp,%.o,$(wildcard *.cpp)) 
SOURCES=$(wildcard *.cpp) 

all: ${A} ${O} ${SOURCES} 

install: ${O} ${MYLIBS} ${SOURCES} 
    ${CXX} ${USEROPTS} -o ${DESTDIR}${BINDIR}/${A} ${O} ${L} 

${A}: ${O} ${MYLIBS} ${SOURCES} 
    ${CXX} ${USEROPTS} -o ${A} ${O} ${L} 

clean:: 
    rm -f ${A} ${O} 

.c.o: 
    ${CXX} ${CXXOPTS} ${USEROPTS} -c $< -o [email protected] 

check-syntax: 
    ${CXX} ${CXXOPTS} ${USEROPTS} -c -o .nul -S ${CHK_SOURCES} 

UPDATE : (편집 나는 문제를 해결하지만,이 메이크가 처음부터 모든 일을하는 이유에 대해 아래 내 업데이트 된 질문을 참조). gnu의 경우에 내가 내 규칙 중 하나에서 .o 파일을 물었을 때 g++ -c -o SeqPrep2.o SeqPrep2.cpp을 실행하여 그냥 만들어야한다고 추측합니다. 나는 그것이 나의 새로운 질문이라고 생각한다. 왜 위의 메이크 파일은 전혀 작동하지 않았고, 왜 나는 그것이 이상한 행동을 보였는가? 한 가지주의해야 할 점은 비록 포맷팅에서 오지는 않았지만, g++-c 사이에 많은 공백이 있고, 내 변수를 넣으려고하는 것과 비슷하지만 그렇지 않다는 것입니다. 그게 부분적으로 원래는 내가 그것이 내 규칙을 전혀 보지 못했다고 믿게 만들었다. 이 자료가 어떻게 작동하는지 이해하도록 도와 주셔서 감사합니다.

+0

당신은 그러나 당신이 CPP 파일을 컴파일하고 .co' 규칙을'있어,이 문제가되지 않습니다, 나는 어떤 사람에의 흐릿한 해요 규칙. – macduff

답변

1

당신은 규칙 .c.o을 얻었지만, 나는 .cpp.o:을 사용할 때 cpp 파일을 컴파일하고 있습니다. 파일 : me.cpp us.cpp you.cpp

내가 얻을 :

Building file me.cpp 
g++ -Iseqan-03-02-2012 -c me.cpp -o me.o 
Building file us.cpp 
g++ -Iseqan-03-02-2012 -c us.cpp -o us.o 
Building file you.cpp 
g++ -Iseqan-03-02-2012 -c you.cpp -o you.o 
g++ -o SeqPrep2 me.o us.o you.o -lm -lz 
+0

감사합니다. 문제가 해결되었는데 .c.o가있는 원본이 전혀 작동하지 않는 이유를 알고 있습니까? g ++ -c whatever.cpp를 실행 중입니다 -o whatever.o는 기본적으로 정의되지 않은 채로 수행됩니다. –

+0

나는 make가 디폴트 .o.cpp를 가지고 있다고 생각한다 : 당신이 그것을 버리면 호출된다. 실행 중에 그것을보고 싶다면'make -d'를해라. 출력은 ** verbose **입니다. – macduff