我的代码已经运行但需要将其移植到另一个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文件中放置定义,或者具有奇怪的模板重载效果。这非常简单,因此不会将可执行文件链接起来。
由于 - 杰夫
答案 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似乎也是重复的)