1

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

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

ACTUAL LINK ERROR: Simulation1.o: In function DoSimulation1(int, char**)': Simulation1.cpp:(.text+0x1800): multiple definition ofDoSimulation1(int, char**)' Simulation1.o:Simulation1.cpp:(.text+0x1800): first defined here

请注意两件奇怪的事情 - (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 复制.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)

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

谢谢 - 杰夫

4

1 回答 1

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复制.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 似乎也被复制了)

于 2013-06-07T23:25:08.910 回答