Makefile 报告 `func[abi:cxx11]()' 的多个定义

Posted

技术标签:

【中文标题】Makefile 报告 `func[abi:cxx11]()\' 的多个定义【英文标题】:Makefile reporting multiple definition of `func[abi:cxx11]()'Makefile 报告 `func[abi:cxx11]()' 的多个定义 【发布时间】:2019-09-14 01:37:26 【问题描述】:

我的教授希望我们在使用 IDE 之前使用终端编译和运行一些 c++ 代码,但我在为其创建 Makefile 时遇到了一些麻烦。我今天去他的办公室寻求帮助,但他的回答很含糊。我一直在网上寻找一个有用的视频,但我遇到了一个我不知道如何解决的错误

我尝试使用以下方法在文本编辑器中编辑 Makefile:

all:
    g++ main.cpp myfunc.cpp -o myexe

然后我进入终端窗口并输入:

$ make    

我收到的错误是:

g++ main.cpp myfunc.cpp -o myexe
/tmp/ccjSAvna.o: In function `func[abi:cxx11]()':
myfunc.cpp:(.text+0x0): multiple definition of `func[abi:cxx11]()'
/tmp/cczKi1CW.o:main.cpp:(.text+0x0): first defined here
collect2: error: ld returned 1 exit status
Makefile:2: recipe for target 'all' failed
make: *** [all] Error 1

我不确定此错误消息的含义或如何解决我的问题。

【问题讨论】:

听起来您刚刚定义了两个名为func() 的函数。重命名其中之一。 那是我的错误,谢谢。 这似乎是main.cppmyfunc.cpp 的问题。请出示相关代码。另请参阅How to create a Minimal, Complete, and Verifiable example。 【参考方案1】:

我不太确定这个错误消息是什么意思 [...]

一旦您意识到每条线的来源,它就相当简单了。第一行是make 从您的makefile 生成的命令:

g++ main.cpp myfunc.cpp -o myexe

这有点奇怪,但很实用。通常一个 makefile 会单独编译每个源文件,然后将生成的目标文件链接在一起,但是一步完成所有事情是可能的。

接下来的几行是g++的输出:

/tmp/ccjSAvna.o: In function `func[abi:cxx11]()':
myfunc.cpp:(.text+0x0): multiple definition of `func[abi:cxx11]()'
/tmp/cczKi1CW.o:main.cpp:(.text+0x0): first defined here

这些表明您的代码中存在错误。由于这与您的 makefile 无关,因此我将继续进行下一行。

collect2: error: ld returned 1 exit status

这一行只显示了之前命令的结果。这是发生链接器错误后应该看到的。

Makefile:2: recipe for target 'all' failed
make: *** [all] Error 1

这些行是来自make 的诊断信息,告诉您构建何时失败。尝试运行您为“all”定义的命令时失败。在这种情况下有点多余,但是当您处理更复杂的 makefile 时,知道哪个规则失败可以节省时间。

[...] 或者我该如何解决我的问题。

您可能希望在查找 makefile 中的问题之前调试您的代码。

【讨论】:

以上是关于Makefile 报告 `func[abi:cxx11]()' 的多个定义的主要内容,如果未能解决你的问题,请参考以下文章

如何链接到共享库中定义的 [abi:cxx11] 函数?

带有 abi:cxx11 的 GCC 未定义引用

如何在GDB中调用C ++函数?

makefile(07)_路径搜索

makefile(05)_自动生成依赖关系

多个文件目录下Makefile的写法