2013-04-03 6 views
4

Я получил эту структуру каталогов:Makefile: правило ставить .o в другом каталоге

  • ./src содержит. cpp и .h всех необходимых мне файлов
  • ./bin временно должен содержать .o и .bin. Кроме того, эту папку следует удалить при вызове make clean.
  • ./ содержит Makefile

Это мой текущий Makefile:

CFLAGS = -Wall -pedantic -g 
CC = g++ 
EXEC = flrfile 
SRC_DIR = src 
BIN_DIR = bin 
OBJ = FixedLengthFieldsRecord.o FixedLengthRecordFile.o main.o 

all: flrfile 

../$(BIN_DIR)/%.o: $(SRC_DIR)%.cpp $(SRC_DIR)%.h 
    $(CC) $(CFLAGS) -c $(SRC_DIR)%.cpp -o [email protected] 

$(EXEC): $(OBJ) 
    @mkdir -p bin 
    $(CC) $(CFLAGS) $(BIN_DIR)/$(OBJ) -o $(BIN_DIR)/$(EXEC) 

.PHONY : clean 

clean: 
    -rm -rf $(BIN_DIR) 

Когда я бегу make, я получаю эту ошибку:

make: *** No rule to make target `FixedLengthFieldsRecord.o', needed by `flrfile'. Stop. 

Почему это?

PS: Кроме того, как я могу сделать OBJ = FixedLengthFieldsRecord.o FixedLengthRecordFile.o main.o более общим? Я не хочу писать все .o ...

+0

http://stackoverflow.com/questions/5178125/gnu-make-how-to-get-object-files-in-separate-subdirectory – gongzhitaao

ответ

3

Это потому, что у вас нет правила для something.o, у вас есть правило для ../bin/something.o.

Если вы измените свои OBJ декларацию

OBJ = ../$(BIN_DIR)/FixedLengthFieldsRecord.o ../$(BIN_DIR)/FixedLengthRecordFile.o ../$(BIN_DIR)/main.o 

Он должен работать.

Вы можете получить объекты из исходной директории, используя подстановочные

SOURCES := $(wildcard $(SRC_DIR)/*.cpp) 
OBJ := $(patsubst $(SRC_DIR)/%,%,$(SOURCES)) 
OBJ := $(patsubst %.cpp,%.o,$(OBJ)) 
OBJ := $(addprefix ../$(BIN_DIR)/,$(OBJ)) 

Что это делает, что сначала получить список CPP файлов из $(SRC_DIR), удаляет путь, а затем заменяют все CPP суффиксов для о и, наконец, добавить `../$(BIN_DIR)/ 'перед каждым элементом.

+1

Кроме того, '$ (BIN_DIR)/$ (OBJ)' в ' $ (EXEC): $ (OBJ) 'следует изменить на' $ (OBJ) '. –

+0

@Akobold, я получаю это: 'Makefile: 6: *** unterminated вызов функции' addeduffix ': missing ')'. Stop.' –

+0

@ i19: Действительно, я пропустил несколько «)» - просто исправил его :) – Akobold

 Смежные вопросы

  • Нет связанных вопросов^_^