Правило make работает неправильно
Есть makefile для сборки многофайлового проекта на C. Текст файла в месте с ошибкой:
C = gcc
CFLAGS = -Wall -lmsvcrt
SRC_C = $(wildcard $(SRC_D)/*.c)
OBJ_C = $(patsubst $(SRC_D)/%.c, $(OBJ_D)/%.o, $(SRC_C))
$(OBJ_C): $(SRC_C)
$(C) $(CFLAGS) -c $< -o $@
Но при запуске выдаёт следующее:
gcc -Wall -lmsvcrt -c src/ConfMain.c -o obj/ConfMain.o
gcc -Wall -lmsvcrt -c src/ConfMain.c -o obj/FileQuery.o
gcc -Wall -lmsvcrt -c src/ConfMain.c -o obj/main.o
gcc -lgcc -o bin/DataBase obj/ConfMain.o obj/FileQuery.o obj/main.o
Я перерыл мануал и перегуглил всё что можно (даже на английском), НО не смог найти где я ошибся.
Ответы (1 шт):
Автор решения: Химик
→ Ссылка
Методом научного тыка нашёл, что если заменить:
$(OBJ_C): $(SRC_C)
$(C) $(CFLAGS) -c $< -o $@
на следующее:
$(OBJ_C): $(OBJ_D)/%.o : $(SRC_D)/%.c
$(C) $(CFLAGS) -c $< -o $@
Ошибка чудом исчезает.
P.S.>> Полный исправленный makefile (в комментариях к вопросу спрашивали):
C = gcc
DEBUGER = gdb
ld = gcc
ld_FLAGS = -lgcc -lmsvcrt
CFLAGS = -Wall
SRC_D = src
OBJ_D = obj
BIN_D = bin
SRC_C = $(wildcard $(SRC_D)/*.c)
OBJ_C = $(patsubst $(SRC_D)/%.c, $(OBJ_D)/%.o, $(SRC_C))
TARGET1 = DataBase
all : $(TARGET1)
$(TARGET1): $(OBJ_C)
$(ld) $(ld_FLAGS) -o $(BIN_D)/$@ $^
$(OBJ_C): $(OBJ_D)/%.o : $(SRC_D)/%.c
$(C) $(CFLAGS) -c $< -o $@
DEBUG: $(TARGET1)
$(DEBUGER) $(BIN_D)/$(TARGET1)
cls
mkdirs:
mkdir $(OBJ_D)
mkdir $(BIN_D)
clear:
del "$(OBJ_D)/" /Q