我有一个项目,需要两个单独的可执行文件,每个可执行文件都具有“ 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 $@
答案 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,一次调用第一个可执行文件的源,另一次调用第二个可执行文件的源