2011-03-02 11 views
10

En mi archivo MAKE tengo una variable de objeto. Necesito anteponer obj/a cada archivo .o. ¿Cómo haría esto?Anteponiendo una ruta en make

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

Su archivo MAKE tiene un par de problemas. Además de usar '$ (CC)' en lugar de '$ (CXX)', es posible que desee [evite crear directorios en un destino diferente, ya que es parallel-build-insafe] (http://stackoverflow.com/questions/ 1894427/makefile-with-directory-tree-creation-suitable-for-parallel-j-build). –

Respuesta

13

Quiere CXX, no CC. CC es para el compilador de C, no el compilador de C++ En cualquier caso, creo que el siguiente debería funcionar:

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: *** No hay regla para hacer objetivo 'mainobj /%. O ', necesario para' all'. Detener. Parece tomar el /% .o literalmente. – Will03uk

+0

¿Agregó la barra después de $ (OBJ_DIR)? Parece oculto – Sagar

+2

'CC' es para el compilador de C, independientemente de si' gcc' es irrelevante. –

9

usted podría utilizar la versión más expresiva de sustitución usted empleado en la asignación de OBJECTS

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

o utilizar una función de transformación de texto estándar

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

'$ (addprefix)' es una extensión de GNU. –

+6

¿Alguien todavía usa una marca que no sea GNU? –

+4

@Maxim: personas en sistemas que no son GNU (BSD, Solaris, IRIX, AIX, ...)? –

Cuestiones relacionadas