首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >2个可执行文件的Makefile错误:“main”的多个定义

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

Stack Overflow用户
提问于 2019-02-09 02:34:00
回答 2查看 800关注 0票数 0

我有一个项目,它需要两个独立的可执行文件,每个都有一个'main‘函数。它们与函数定义共享一个头文件和另一个文件。我正在使用的makefile给出了"multiple definition of ` `main'“错误。我想将这两个可执行文件编译到"./bld“文件夹中。有没有人能给我指点一下我哪里做错了?谢谢。

代码语言:javascript
运行
AI代码解释
复制
   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 $@
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-09 18:27:54

对于我的C/C++项目,我对Makefile使用了不同类型的模板,但以下是该模板在您的情况下的样子

代码语言:javascript
运行
AI代码解释
复制
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 executableName1“和"make executableName2”来分别构建每个可执行文件。如果你想让你的模板保持原样,我建议你在Makefile上做一些小研究,以理解这两个模板,并看看如何合并它们;)

票数 1
EN

Stack Overflow用户

发布于 2019-02-09 02:39:18

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54602619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档