我有一个项目需要两个单独的可执行文件,每个文件都有一个“主”函数。它们共享一个头文件和另一个包含函数定义的文件。我正在使用的 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 $@
最佳答案
对于我的 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”来构建两个可执行文件,并且可以通过调用“makeexecutableName1”和“makeexecutableName2”分别构建每个可执行文件。如果您想保持模板不变,我建议您对 Makefile 进行一些研究,以了解这两个模板并了解如何合并它们;)
关于c - 2 个可执行文件的 Makefile 错误 : multiple definitions of 'main' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54602619/