2013-04-28 7 views
4

메이크 파일을 작성하여 독립 소스 코드를 가지고 있지만 컴파일 규칙과 공유 종속성 (공통 헤더)이있는 동일한 디렉토리에 C++ 프로그램 세트를 작성하려고합니다.메이크 파일의 종속성 목록에 대상 이름을 전달합니다.

/path/to/project/ 
    peformance.h 
    vector.h 
    pqvm.cpp 
    quantum/ 
     quantum-tbb.h 
     quantum-sequential.h 
     ... 
    tests/ 
     grainsize.cpp 
     kronecker.cpp 
     sigma-z.cpp 
     ... 
     Makefile 

은 내가 tests 폴더에있는 소스, 해당 실행 파일에 각 소스를 컴파일합니다. 아래는 내가 사용하려고하는 메이크 파일입니다. 줄에 문제가있는 것 같습니다. $(TARGETS): %.o.

나는 현재 대상의 이름 (예를 들어, grainsize)를 참조 할하고 (예를 들어 grainsize.o), 둘 %.o[email protected]이 제대로 작동하지 해당 객체 파일에 의존합니다. 나는 라인을 $(TARGETS): $(OBJECTS)으로 바꿀 수 있었지만, 모든 타겟은 모든 오브젝트에 의존 할 것이고, 각각의 변경에서 많은 불필요한 재 컴파일을 유발할 것이다.

그래서 기본적으로 : 종속성 목록에서 대상 이름을 올바르게 참조하려면 어떻게해야합니까? 이 관련된 질문 : Passing target name to a dependency in makefile을 알고 있지만이 문제에 어떻게 적용되는지 알 수 없습니다.

$ make 
make: *** No rule to make target `%.o', needed by `grainsize'. Stop. 

답변

14

문제는이 때문이다 :

CXX  = g++ 
SOURCES = $(wildcard *.cpp) 
DEPS = ../performance.h $(wildcard ../quantum/*.h) ../vector.h 
TARGETS = $(basename $(SOURCES)) 
OBJECTS = $(addsuffix .o, $(TARGETS)) 

INCPATH = -I../../local/include 
LIBPATH = -L../../local/lib 
LIBS = -lpfm -lpapi -ltbb 
OFLAGS = -Wall -O2 
DFLAGS = -g3 
CFLAGS = -march=native $(OFLAGS) $(DFLAGS) $(INCPATH) $(LIBPATH) -fopenmp 

UNAME = $(shell uname) 
ifeq ($(UNAME), Linux) 
    LIBS += -lrt 
endif 

.PHONY: all 

all: $(TARGETS) 

#for each target: link its object file to the libraries and produce an executable binary 
#this does not work as expected 
$(TARGETS): %.o 
    $(CXX) $(CFLAGS) [email protected] $(LIBS) -o [email protected] 

#compile each target to its object file 
#this works as expected 
%.o: %.cpp $(DEPS) 
    $(CXX) -c $(CFLAGS) -o [email protected] $< 

명령 행에 오류 메시지입니다

$(TARGETS): %.o 
    ... 

는 패턴 규칙 아니다; 선행 조건 목록에는 '%'가 있지만 대상에는 없습니다. 따라서 Make는 '%'를 문자 그대로 해석하며 %.o과 같은 파일은 없습니다.

이 시도 :

$(TARGETS): % : %.o 
    $(CXX) $(CFLAGS) $^ $(LIBS) -o [email protected] 

이는 static pattern rule이다. 또한 [email protected] (작동하지만 침울함)을 $^ ("전제 조건"을 의미하며 눈에 더 강하고 쉽게 적용됨)으로 변경했습니다.

+1

+1 또한,'$ ^'는 다른 모든 의존성을 포함합니다. 이것은 보통 좋은 일이지만, 어떤 이유로 든 그것을 원하지 않는다면,'$ <'는 당신에게 첫 번째 의존성을줍니다. (추가 의존성은이 패턴 규칙 밖에서 선언 될 수 있으므로'foo : bar.o'를'foo'에 대한 추가 의존성으로 말할 수 있고'foo'와'$ (TARGETS)'.) – tripleee

+0

감사합니다. – kmoerman

관련 문제