我正在尝试使用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
文件中。造成这种情况的原因是什么?
答案 0 :(得分:3)
查看编译行。
您正在main.cpp
和main.o
同时编译App.o
。
您将所有源文件列为%.o
模式的先决条件,并使用$<
仅编译第一个(恰好是main.cpp
在这种情况下。
您希望%.c
代替$(SRC)
。
答案 1 :(得分:2)
看看以下几行:
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)