【问题标题】:Multiple Function Definition Error Makefile? [closed]多个函数定义错误生成文件? [关闭]
【发布时间】:2016-11-03 00:31:28
【问题描述】:

所以这不应该带来那么多麻烦,但我正在尝试使用通配符创建一个更高效的 makefile,而不是我过去使用的繁琐方法,让每个人都经历目标文件,然后将它们链接在一起。但是,无论出于何种原因,每当我尝试运行“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 已生成并放置在正确的目录中,因此错误必须与链接器有关。如果有人认为它会有所帮助,我可以包含 c++ 源代码,但文件实际上是空的(尽管我仍然放入了标头保护),因为我只是想确保首先正确链接所有内容,所以我可以处理这样的问题,也不必担心代码。目录结构如下:

-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

【问题讨论】:

  • 你的问题不是你的 Makefile。您的问题出在 ScreenMgr.cpp 或 ScreenMgr.h
  • 你可能在头文件中没有适当的包含保护。
  • 或者你在.cpp.h中定义了构造函数。
  • 或者您可能在 .cpp 文件中定义了两次默认构造函数。
  • 其实这个Makefile的问题。看看我还没写的答案。

标签: c++ makefile linker wildcard gnu-make


【解决方案1】:
$(BUILDIR)/%.o: $(SRCS)

这一行告诉make它可以从所有源文件构建任何 .o文件。

    $(CC) $(CFLAGS) -c $< -o $@

而在这一行中,$&lt;表示first依赖,即$(SRCS)中的first源文件,即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 的两个“副本”,而不是链接 main.cpp!

改成:

$(BUILDDIR)/%.o: $(SRCDIR)/%.cpp

改为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多