使用 Makefile 对 main 的多个定义

Posted

技术标签:

【中文标题】使用 Makefile 对 main 的多个定义【英文标题】:Multiple definitions of main with Makefile 【发布时间】:2014-08-21 17:37:08 【问题描述】:

我正在尝试使用 make 编译我的 C++ 程序,但我遇到了这个我不太明白的问题。我的项目的 src 文件夹中有 3 个文件:App.hApp.cppmain.cpp。我的 Makefile 位于项目的根文件夹中,其中包含我在其中提到的 src 文件夹。这就是我的 Makefile 的样子:

CC=g++
SRCDIR=./src
CFLAGS=-I$(SRCDIR)
LIBS=-lSDL -lGL
_DEPS=App.h
DEPS=$(patsubst %,$(SRCDIR)/%,$(_DEPS))
_OBJ=main.o App.o
OBJ=$(patsubst %,$(SRCDIR)/%,$(_OBJ))
_SRC=main.cpp App.cpp
SRC=$(patsubst %,$(SRCDIR)/%,$(_SRC))

%.o: $(SRC) $(DEPS)
    $(CC) -c -o $@ $< $(CFLAGS)

tetris: $(OBJ)
    $(CC) -o $@ $^ $(CFLAGS) $(LIBS)

clean:
    rm -f $(SRCDIR)/*.o $(SRCDIR)/*~ 

当我在终端中输入make 进行编译时,出现如下错误:

g++ -c -o src/main.o src/main.cpp -I./src
g++ -c -o src/App.o src/main.cpp -I./src
g++ -o tetris src/main.o src/App.o -I./src -lSDL -lGL
src/App.o: In function `main':
main.cpp:(.text+0x0): multiple definition of `main'
src/main.o:main.cpp:(.text+0x0): first defined here
src/main.o: In function `main':
main.cpp:(.text+0x17): undefined reference to `App::App()'
main.cpp:(.text+0x23): undefined reference to `App::onExecute()'
src/App.o: In function `main':
main.cpp:(.text+0x17): undefined reference to `App::App()'
main.cpp:(.text+0x23): undefined reference to `App::onExecute()'
collect2: error: ld returned 1 exit status

但我确信我只有 1 个主要功能,它在 main.cpp 文件中。这是什么原因造成的?

【问题讨论】:

【参考方案1】:

看看这些行:

src/main.o: In function `main':
src/App.o: In function `main':

这意味着mainmain.oApp.o 中都有定义。

除此之外:

g++ -c -o src/main.o src/main.cpp -I./src
g++ -c -o src/App.o src/main.cpp -I./src

看到了吗?两个目标文件都是使用相同的源构建的!

您可能想要更改对象依赖的这一行:

%.o: %.c $(DEPS)

【讨论】:

【参考方案2】:

查看编译行。

您正在将main.cpp 编译为main.oApp.o

您将所有源文件列为%.o 模式的先决条件,并使用$&lt; 仅编译第一个文件(在这种情况下恰好是main.cpp

你想要%.c而不是$(SRC)

【讨论】:

非常感谢!但我不得不接受罗德里戈的回答,因为他是第一个回答的人

以上是关于使用 Makefile 对 main 的多个定义的主要内容,如果未能解决你的问题,请参考以下文章

使用Makefile编译多个c源代码的方法

在 Eclipse/CDT 中使用自定义 Makefile [重复]

makefile使用笔记入门

Makefile 总是重新编译一个文件

在多个 Makefile 中包含 Makefile 和 Echo 变量

学习Makefile