奇怪的场景让g ++错误多重定义函数

时间:2013-06-07 23:21:08

标签: c++ hyperlink g++ definition

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

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

ACLUAL LINK ERROR: Simulation1.o:在函数DoSimulation1(int, char**)': Simulation1.cpp:(.text+0x1800): multiple definition of DoSimulation1(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)

有什么想法?通常这样的错误来自于在include文件中放置定义,或者具有奇怪的模板重载效果。这非常简单,因此不会将可执行文件链接起来。

由于 - 杰夫

1 个答案:

答案 0 :(得分:0)

也许是因为你的链接命令中有两个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似乎也是重复的)