使用 Makefile 对 main 的多个定义
Posted
技术标签:
【中文标题】使用 Makefile 对 main 的多个定义【英文标题】:Multiple definitions of main with Makefile 【发布时间】:2014-08-21 17:37:08 【问题描述】:我正在尝试使用 make
编译我的 C++ 程序,但我遇到了这个我不太明白的问题。我的项目的 src
文件夹中有 3 个文件:App.h
、App.cpp
和 main.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':
这意味着main
在main.o
和App.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.o
和App.o
。
您将所有源文件列为%.o
模式的先决条件,并使用$<
仅编译第一个文件(在这种情况下恰好是main.cpp
。
你想要%.c
而不是$(SRC)
。
【讨论】:
非常感谢!但我不得不接受罗德里戈的回答,因为他是第一个回答的人以上是关于使用 Makefile 对 main 的多个定义的主要内容,如果未能解决你的问题,请参考以下文章
在 Eclipse/CDT 中使用自定义 Makefile [重复]