2011-03-02 4 views
10

내 makefile에 객체 변수가 있습니다. 나는 모든 .o 파일에 obj를 붙일 필요가있다. 어떻게하면 좋을까요?미리 경로를 만들 때

CC=g++ 
CFLAGS=-C -Wall 
LDFLAGS=-lsqlite3 -lpthread -ldl 
SOURCES=main.cpp Database.cpp actionInit.cpp TileSet.cpp Player.cpp 
OBJECTS=$(SOURCES:.cpp=.o) 

EXECUTABLE=mahjong-counter 

all: bin $(OBJECTS) $(EXECUTABLE) 

bin: 
    mkdir -p bin 

%.o: %.cpp 
    $(CC) $(LDFLAGS) $< -c -o [email protected] 

$(EXECUTABLE): $(OBJECTS) 
    $(CC) $(LDFLAGS) $(OBJECTS) -o $(EXECUTABLE) 

clean: 
    rm $(OBJECTS) 
+0

귀하의 메이크 파일에는 몇 가지 문제가 있습니다. '$ (CXX) '대신'$ (CC)'를 사용하는 것과는 별도로, 병렬 빌드가 안전하지 않은 별도의 타겟에 디렉토리를 생성하는 것을 피할 수 있습니다 (http://stackoverflow.com/questions/). 1894427/makefile-with-directory-tree-creation-for-parallel-j-build)을 사용하십시오. –

답변

13

CC가 아닌 CXX를 원합니다. CC는 C 컴파일러입니다는 C++ 어떤 경우 컴파일러 , 나는 다음과 같은 일을해야 생각하지 :

CXX=g++ 
CXXFLAGS=-C -Wall 
LDFLAGS=-lsqlite3 -lpthread -ldl 

OBJ_DIR = obj 
BIN_DIR = bin 
EXECUTABLE=mahjong-counter 

SOURCES= main.cpp Database.cpp actionInit.cpp TileSet.cpp Player.cpp 
OBJECTS= $(SOURCES:%.cpp=$(OBJ_DIR)/%.o) 

all: dirs $(OBJECTS) $(EXECUTABLE) 

$(EXECUTABLE): $(OBJECTS) 
    $(CC) $(LDFLAGS) $(OBJECTS) -o $(EXECUTABLE) 

$(OBJ_DIR)/%.o: %.cpp 
     $(CXX) $(CXXFLAGS) $< -o [email protected] 

dirs: 
    mkdir -p $(BIN_DIR) 
    mkdir -p $(OBJ_DIR) 

.PHONY: dirs all 
+0

make : *** 'mainobj/% .o'대상을 만들기위한 규칙이없고, 'all'이 필요합니다. 중지. 문자 그대로 /%.o를 사용하는 것 같습니다. – Will03uk

+0

$ (OBJ_DIR) 뒤에 슬래시를 추가 했습니까? 숨겨진 것 같습니다. – Sagar

+2

'CC'는 C 컴파일러를위한 것입니다.'gcc'가 부적절한 것이 든 아니든간에. –

9

당신은 당신이 고용 대체 더 표현 버전을 사용할 수 OBJECTS

OBJECTS=$(SOURCES:%.cpp=obj/%.o) 

또는를 할당 할 때 표준 텍스트 변환 함수를 사용하십시오.

OBJECTS=$(addprefix obj/,$(SOURCES:.cpp=.o)) 
+1

'$ (addprefix)'는 GNU 확장입니다. –

+6

아직 비 GNU make를 사용하는 사람이 있습니까? –

+4

@Maxim : 비 GNU 시스템 (BSD, Solaris, IRIX, AIX 등)에있는 사람들? –

관련 문제