2012-01-29 5 views
0

Последующая деятельность: Set up a development environment on Linux targeting Linux and Windowsmake: правило шаблона не применяется?

реж проекта выглядит следующим образом:

/pps 
    /src 
    /obj 
    /bin 
    Makefile 

И содержание Makefile это:

OBJ_DIR = obj 
SRC_DIR = src 
BIN_DIR = bin 

INCLUDE = -I./$(SRC_DIR) 
LIBS = 

_SRCS = print_current_dir.c test_main.c 

_OBJS = print_current_dir.o test_main.o 

SRCS = $(addprefix $(SRC_DIR)/,$(_SRCS)) 
OBJS = $(addprefix $(OBJ_DIR)/,$(_OBJS)) 

$(OBJ_DIR)/%.o: %.c %.h 
    $(CC) -c -o $(OBJ_DIR)/[email protected] $< $(CFLAGS) 

all: $(BIN_DIR)/pps-linux $(BIN_DIR)/pps-win32 

$(BIN_DIR)/pps-linux: $(OBJS) 
    CC = cc 
    CFLAGS = -g -Wall $(INCLUDE) $(LIBS) 

$(BIN_DIR)/pps-win32: $(OBJS) 
    CC = i586-mingw32msvc-cc 
    CFLAGS = -g -Wall $(INCLUDE) $(LIBS) 

.PHONY: clean 

clean: 
    rm -f $(OBJS) $(SRC_DIR)/~ core $(BIN_DIR)/* 

файловсписок print_current_dir.c и test_main.c являются просто для тестирования.

Этот Makefile не работает:

$ make 
make: *** No rule to make target `obj/print_current_dir.o', needed by `bin/pps-linux'. Stop. 

Я думаю, что проблема с правилом% .o. Я уверен, что это тривиально, но я не очень разбираюсь в этом.

спасибо.

+1

Обратите внимание, что если вы наберете 'make' без указания цели, первый в файле используется по умолчанию. Поэтому вы, вероятно, не хотите '$ (OBJ_DIR) /%. O' в качестве вашей первой цели. –

ответ

3

Это правило:

$(OBJ_DIR)/%.o: %.c %.h 

указывает, что obj/foo.o зависит от foo.c, а не src/foo.c. Нет foo.c, поэтому это правило не может быть применено (следовательно, сообщение об ошибке).

Это должно сделать работу:

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c $(SRC_DIR)/%.h 
Смежные вопросы