make: шаблонное правило не применяется? - PullRequest
0 голосов
/ 30 января 2012

Последующие действия: Настройка среды разработки для Linux с ориентацией на Linux и Windows

Проект dir выглядит так:

/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)/$@ $< $(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 предназначены только для тестирования.

Этот make-файл не работает:

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

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

Спасибо.

1 Ответ

3 голосов
/ 30 января 2012

Это правило:

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

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

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

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c $(SRC_DIR)/%.h
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...