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

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

实际链接错误:
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直方图2.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
  直方图.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 ++过滤_Z13DoSimulation1iPPc
DoSimulation1(int,char **)

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

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

有什么想法吗?通常,此类错误是由于将定义放入包含文件中,或具有怪异的模板重载效果。这非常简单,因此不会链接可执行文件。

谢谢
-杰夫

最佳答案

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


  g ++ -O3 -std = c ++ 11 CorrelatePCandFrequency.o CountBroadcasts.o
  CheckMemDependencies.o MathModel.o直方图2.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
  直方图.o jExcel.o main.o jPreConditionedHintFile.o JVector.o
  jBitArray.o Ops.o -o sim


(copy.o似乎也是重复的)

10-08 14:54