多函数定义错误 Makefile?
Multiple Function Definition Error Makefile?
所以这不应该像现在这样带来很多麻烦,但我正在尝试使用通配符创建一个更高效的 makefile,而不是我过去使用的繁琐方法每个人 object 文件,然后 link 他们在一起。但是,无论出于何种原因,每当我尝试 运行 'make' 时,它都会给我这个:
multiple definition of 'ScreenMgr::ScreenMgr()'
/path/to/ScrenMgr.cpp:4: first defined here
然后它还会在这个错误之后立即给我另一个错误:
undefined reference to main
collect2: error: ld returned 1 exit status
虽然在这些错误之前,我的 .o 已生成并放置在正确的目录中,所以错误必须与 linker 有关。如果有人认为它会有所帮助,我可以包括 c++ 源代码,但文件实际上是空的(尽管我仍然放入 header 守卫),因为我只是想确保一切 link首先正确,这样我就可以处理这样的问题,而不必担心代码。目录结构如下:
-MsSolver
|--src
| |--main.cpp
| |--ScreenMgr.cpp
|--include
| |--ScreenMgr.h
|--build #empty directory
|
|--Makefile
|:
|--bin
这是生成文件:
CC:=g++
DEBUG:=-g
CFLAGS:=-Wall $(DEBUG)
LDFLAGS:=-Wall $(DEBUG)
SRCDIR:=$(PWD)/src
BUILDDIR:=$(PWD)/build
INCDIR:=$(PWD)/include
BINDIR:=$(PWD)/bin
FILES:=ScreenMgr main
INCLUDES:=-I$(INCDIR)
SRCS:=$(patsubst %,$(SRCDIR)/%.cpp,$(FILES))
OBJS:=$(patsubst %,$(BUILDDIR)/%.o,$(FILES))
LIBS:=-lX11
TARGET:=mssolver
#create executable and link
$(BINDIR)/$(TARGET): $(OBJS)
$(CC) $(LFLAGS) $(INCLUDES) $(LIBS) $(OBJS) -o $@
#Compile objs
$(BUILDIR)/%.o: $(SRCS)
$(CC) $(CFLAGS) -c $< -o $@
clean:
rm -f $(BUILDDIR)/*.o $(BINDIR)/*.o $(INCDIR)/*.swp $(SRCDIR)/*.swp
$(BUILDIR)/%.o: $(SRCS)
这一行告诉 make
它可以从 所有 源文件构建 any .o 文件。
$(CC) $(CFLAGS) -c $< -o $@
并且在这一行中,$<
表示 first 依赖项,即 first 源文件在 $(SRCS)
,即 src/ScreenMgr.cpp
.
所以 Make 基本上会这样做来构建目标文件:
$(CC) $(CCFLAGS) -c src/ScreenMgr.cpp -o build/ScreenMgr.o
$(CC) $(CCFLAGS) -c src/ScreenMgr.cpp -o build/main.o
$(CC) $(LFLAGS) $(INCLUDES) $(LIBS) build/ScreenMgr.o build/main.o -o bin/mssolver
根据 .o 文件的名称,您可能认为它工作正常...但事实并非如此,它实际上链接了 ScreenMgr.cpp 中的两个 "copies",而不是链接 main.cpp!
改为:
$(BUILDDIR)/%.o: $(SRCDIR)/%.cpp
相反。
所以这不应该像现在这样带来很多麻烦,但我正在尝试使用通配符创建一个更高效的 makefile,而不是我过去使用的繁琐方法每个人 object 文件,然后 link 他们在一起。但是,无论出于何种原因,每当我尝试 运行 'make' 时,它都会给我这个:
multiple definition of 'ScreenMgr::ScreenMgr()'
/path/to/ScrenMgr.cpp:4: first defined here
然后它还会在这个错误之后立即给我另一个错误:
undefined reference to main
collect2: error: ld returned 1 exit status
虽然在这些错误之前,我的 .o 已生成并放置在正确的目录中,所以错误必须与 linker 有关。如果有人认为它会有所帮助,我可以包括 c++ 源代码,但文件实际上是空的(尽管我仍然放入 header 守卫),因为我只是想确保一切 link首先正确,这样我就可以处理这样的问题,而不必担心代码。目录结构如下:
-MsSolver
|--src
| |--main.cpp
| |--ScreenMgr.cpp
|--include
| |--ScreenMgr.h
|--build #empty directory
|
|--Makefile
|:
|--bin
这是生成文件:
CC:=g++
DEBUG:=-g
CFLAGS:=-Wall $(DEBUG)
LDFLAGS:=-Wall $(DEBUG)
SRCDIR:=$(PWD)/src
BUILDDIR:=$(PWD)/build
INCDIR:=$(PWD)/include
BINDIR:=$(PWD)/bin
FILES:=ScreenMgr main
INCLUDES:=-I$(INCDIR)
SRCS:=$(patsubst %,$(SRCDIR)/%.cpp,$(FILES))
OBJS:=$(patsubst %,$(BUILDDIR)/%.o,$(FILES))
LIBS:=-lX11
TARGET:=mssolver
#create executable and link
$(BINDIR)/$(TARGET): $(OBJS)
$(CC) $(LFLAGS) $(INCLUDES) $(LIBS) $(OBJS) -o $@
#Compile objs
$(BUILDIR)/%.o: $(SRCS)
$(CC) $(CFLAGS) -c $< -o $@
clean:
rm -f $(BUILDDIR)/*.o $(BINDIR)/*.o $(INCDIR)/*.swp $(SRCDIR)/*.swp
$(BUILDIR)/%.o: $(SRCS)
这一行告诉 make
它可以从 所有 源文件构建 any .o 文件。
$(CC) $(CFLAGS) -c $< -o $@
并且在这一行中,$<
表示 first 依赖项,即 first 源文件在 $(SRCS)
,即 src/ScreenMgr.cpp
.
所以 Make 基本上会这样做来构建目标文件:
$(CC) $(CCFLAGS) -c src/ScreenMgr.cpp -o build/ScreenMgr.o
$(CC) $(CCFLAGS) -c src/ScreenMgr.cpp -o build/main.o
$(CC) $(LFLAGS) $(INCLUDES) $(LIBS) build/ScreenMgr.o build/main.o -o bin/mssolver
根据 .o 文件的名称,您可能认为它工作正常...但事实并非如此,它实际上链接了 ScreenMgr.cpp 中的两个 "copies",而不是链接 main.cpp!
改为:
$(BUILDDIR)/%.o: $(SRCDIR)/%.cpp
相反。