Ошибки Makefile с двумя исполняемыми файлами: несколько определений 'main' - PullRequest
0 голосов
/ 09 февраля 2019

У меня есть проект, который требует двух отдельных исполняемых файлов, каждый с функцией 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 ]

0 голосов
/ 09 февраля 2019

Для моих проектов на 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, чтобы понять оба шаблона и посмотреть, как их объединить;)

0 голосов
/ 09 февраля 2019

Глядя на ваш Makefile, вы, похоже, вызываете только один раз gcc, чтобы собрать два ваших исполняемых файла.Для создания двух исполняемых файлов вам нужно два раза вызвать gcc один с источниками первого исполняемого файла, а другой с источниками второго исполняемого файла

...