c - 2 个可执行文件的 Makefile 错误 : multiple definitions of 'main'

标签 c makefile

我有一个项目需要两个单独的可执行文件,每个文件都有一个“主”函数。它们共享一个头文件和另一个包含函数定义的文件。我正在使用的 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/

相关文章:

c++ - 静态库如何链接到依赖项?

python - 使用 C python api 时消息长度不正确

c - C 定义的 Makefile 参数 - 需要干净

ios - 无法使用 make 命令创建 iOS 静态库 .a 文件

makefile - makefile中的%和*有什么区别

c++ - Makefile 中扩展正则表达式列表的分隔符

c - 无法在 automake 步骤上构建 spice

c - "Expected declaration before ' struct ' "声明函数时?

c - fork /等待 C 程序。我的输出应该是什么?我的输出正确吗?

c - 生成文件错误 : make: *** No rule to make target `omp.h' ; with OpenMP