C/Makefile здесь относительный новичок. У меня есть проект C, структура которого выглядит следующим образом:
Код: Выделить всё
main.c
subdir1
a.h
a.c
b.h
b.c
subdir2
x.h
x.c
y.h
y.c
Я указываю исходные файлы следующим образом (я уверен, что для подобных вещей есть хитрое правило Makefile):
Код: Выделить всё
SOURCES := \
subdir1/subdir2/x.c \
subdir1/subdir2/y.c \
subdir1/a.c \
subdir1/b.c \
main.c
Я также могу указать свои включения следующим образом (я уверен, что есть лучший способ сделать это):
Код: Выделить всё
SRC_DIR := .
INCLUDES = -I$(SRC_DIR) -I$(SRC_DIR)/subdir1 -I$(SRC_DIR)/subdir2
Я хочу, чтобы скомпилированные объектные файлы находились в одном каталоге:
Код: Выделить всё
BUILD := build
OBJ = $(addprefix $(BUILD)/,$(notdir $(SOURCES:.c=.o)))
Затем я указываю свои цели и зависимости следующим образом:
Код: Выделить всё
all: test
test: $(OBJ)
$(CC) $(CFLAGS) $(OBJ) -o $(EXECUTABLE)
$(OBJ): $(C_SRC)
$(CC) -c $(CFLAGS) $(INCLUDES) $< -o $@
clean:
$(RM) $(BIN_DIR)/*.o
Когда я это делаю, похоже, что символ $< в соответствии с правилом $(OBJ) всегда принимает первый элемент в списке зависимостей $(C_SRC) (в данном случае x.c), хотя целевой символ $@ правильно отражает желаемый символ (xo, yo, ao и т. д.). Это заставляет компоновщик жаловаться, потому что один и тот же входной файл (x.c) компилируется в каждый ожидаемый выходной файл, поэтому используются несколько определяемых символов.
Может кто-нибудь помочь?
Подробнее здесь:
https://stackoverflow.com/questions/797 ... c-makefile