Ошибки Makefile с двумя исполняемыми файлами: несколько определений 'main'
У меня есть проект, который требует двух отдельных исполняемых файлов, каждый с функцией main. Они совместно используют заголовочный файл и другой файл с определениями функций. Используемый мной make-файл выдает ошибку "множественное определение" main "". Я хочу скомпилировать оба исполняемых файла в папку "./bld". Может кто-нибудь подсказать мне, что я делаю не так? Благодарю.
CC := gcc
CFLAGS := -g -Wall -Werror
RM := rm
MKDIR := mkdir -p
OUT_DIR := bld
OBJ_DIR := $(OUT_DIR)/obj
SOURCES := $(wildcard *.c)
OBJECTS := $(addprefix $(OBJ_DIR)/, $(SOURCES:.c=.o))
TARGET := $(addprefix $(OUT_DIR)/, $(SOURCES:.c=))
.PHONY: all clean
all: $(TARGET)
clean:
$(RM) -rf $(OUT_DIR)
$(TARGET): $(OBJECTS)
$(CC) $(CFLAGS) $^ -o $@
$(OBJ_DIR)/%.o: %.c
@$(MKDIR) $(dir $@)
$(CC) $(CFLAGS) -c $< -o $@
2 ответа
Для моих проектов на C/C++ я использую другой тип шаблона для моего Makefile, но вот как будет выглядеть шаблон для вашего случая
SRC1 = main1.c \
other.c
OBJ1 = $(SRC1:.c=.o)
NAME1 = executableName1
SRC2 = main2.c \
other.c
OBJ2 = $(SRC2:.c=.o)
NAME2 = executableName2
all: $(NAME1) $(NAME2)
$(NAME1): $(OBJ1)
gcc -o $(NAME1) $(OBJ1)
$(NAME2): $(OBJ2)
gcc -o $(NAME2) $(OBJ2)
clean:
rm -Rf $(OBJ1)
rm -Rf $(OBJ2)
fclean: clean
rm -Rf $(NAME1)
rm -Rf $(NAME2)
re: fclean all
.PHONY: all clean fclean re
Как вы видите, я не использую *.c, потому что таким образом у меня мог бы быть весь мой исходный код в одной папке без компиляции файлов, которые я не хочу для каждого исполняемого файла. Используя этот Makefile, вы можете создавать оба исполняемых файла, вызывая "make" или "make all", и вы можете создавать каждый исполняемый файл отдельно, вызывая "make executetableName1" и "make executetableName2". Если вы хотите сохранить свой шаблон таким, какой он есть, я предлагаю вам немного изучить Makefile, чтобы понять оба шаблона и посмотреть, как их объединить;)
Глядя на ваш Makefile, вы, похоже, вызываете только один раз gcc для создания ваших двух исполняемых файлов. Для создания двух исполняемых файлов вам нужно два раза вызвать gcc один с источниками первого исполняемого файла, а другой - с источниками второго исполняемого файла.