Ошибки 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 один с источниками первого исполняемого файла, а другой - с источниками второго исполняемого файла.

Другие вопросы по тегам