【问题标题】:Strange scenario getting g++ error multiple definition of functions奇怪的场景得到g ++错误多个函数定义
【发布时间】:2013-06-04 08:42:23
【问题描述】:

我的代码已经可以运行,但需要将其移植到另一个 Linux 平台。我总是不得不针对 gcc/g++ 差异调整代码 - 通常给定版本的 g++ 只是在它允许的范围内受到更多限制。

在这种情况下,我在一个非常简单的情况下遇到了多函数定义错误 - 单个 cpp 文件中的单个全局函数被调用一次。我在最后的 g++ 链接行中没有看到目标文件的任何重复列表。源文件文本(通过搜索)或编译的目标文件(使用 objdump -t)中没有重复项。事实上,错误通过在对象中列出相同的偏移量来确认没有真正的重复:

实际链接错误: Simulation1.o:在函数DoSimulation1(int, char**)': Simulation1.cpp:(.text+0x1800): multiple definition ofDoSimulation1(int, char**)' Simulation1.o:Simulation1.cpp:(.text+0x1800):这里先定义

注意两件奇怪的事情 - (1) 原始和重复都位于 .text+0x1800,以及 (2) 似乎在函数内部找到了被调用函数的副本,但这不是递归函数,并且它不调用自己。

这是链接行:

g++ -O3 -std=c++11 CorrelatePCandFrequency.o CountBroadcasts.o CheckMemDependencies.o MathModel.o Histograms2.o EvalOddSetCaches2.o jDEQ.o ChipControl.o jSimplestCache.o WorkingSets.o EvalOddSetCaches3.o QuickAnal.o Simulation1.o copy.o ValidateTrailFile.o jCommon.o CountBroadcasts2.o jSimpleCache2.o BankConflicts.o ParsePTXTrace.o DynamicTrace.o copy.o Simulation1.o Histograms.o jExcel.o main.o jPreConditionedHintFile.o JVector.o jBitArray.o Ops.o -o sim

文件 Simulation1.cpp 中的单个函数定义:

bool DoSimulation1(int argc, char* argv[])
  {
  ...
  }

请注意,当我在 Simulation1.o 上执行 objdump -t 然后在 c++filt 上执行时,我得到了轻微的变化:

0000000000001800 g F.text 000000000000049b _Z13DoSimulation1iPPc

c++filt _Z13DoSimulation1iPPc DoSimulation1(int, char**)

因此,如果有什么遗漏,可能是 char** 和 char* []) 之间的区别

同样,这在其他平台上也可以正常编译。 此错误与: gcc 版本 4.7.2 20121109 (Red Hat 4.7.2-8) (GCC)

有什么想法吗?通常,像这样的错误来自将定义放入包含文件中,或者具有奇怪的模板重载效果。这很简单,因此它不会链接可执行文件。

谢谢 - 杰夫

【问题讨论】:

    标签: c++ hyperlink g++ definition


    【解决方案1】:

    可能是因为您的链接命令中有两个Simulation1.o

    g++ -O3 -std=c++11 CorrelatePCandFrequency.o CountBroadcasts.o CheckMemDependencies.o MathModel.o Histograms2.o EvalOddSetCaches2.o jDEQ.o ChipControl.o jSimplestCache.o WorkingSets.o EvalOddSetCaches3.o QuickAnal.o Simulation1.o copy.o ValidateTrailFile.o jCommon.o CountBroadcasts2.o jSimpleCache2.o BankConflicts.o ParsePTXTrace.o DynamicTrace.o copy.o Simulation1.o Histograms.o jExcel.o main.o jPreConditionedHintFile.o JVector.o jBitArray.o Ops.o -o sim

    (copy.o 好像也是重复的)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-27
      • 1970-01-01
      • 1970-01-01
      • 2015-03-26
      相关资源
      最近更新 更多