带有2个可执行文件的Makefile错误:“ main”的多个定义

时间:2019-02-09 02:34:00

标签: c makefile makefile-errors

我有一个项目,需要两个单独的可执行文件,每个可执行文件都具有“ main”功能。它们共享一个头文件和另一个带有函数定义的文件。我使用的makefile给我“ 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 :(得分:1)

对于我的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 executeName1”和“ make executeName2”分别构建每个可执行文件。如果您希望保持模板不变,建议您对Makefile进行一些研究,以了解这两个模板并查看如何合并它们;)

答案 1 :(得分:0)

在查看Makefile时,您似乎只调用一次gcc来构建两个可执行文件。要构建两个可执行文件,您需要两次调用gcc,一次调用第一个可执行文件的源,另一次调用第二个可执行文件的源