我的代码已经可以运行,但需要将其移植到另一个 Linux 平台。我总是不得不针对 gcc/g++ 差异调整代码——通常给定的 g++ 版本在它允许的范围内受到更多限制。
在这种情况下,我在一个非常简单的情况下遇到了多函数定义错误 - 单个 cpp 文件中的单个全局函数被调用一次。我在最后的 g++ 链接行中没有看到目标文件的任何重复列表。源文件文本(通过搜索)或编译的目标文件(使用 objdump -t)中没有重复项。事实上,错误通过在对象中列出相同的偏移量来确认没有真正的重复:
ACTUAL LINK ERROR: Simulation1.o: In function DoSimulation1(int, char**)':
Simulation1.cpp:(.text+0x1800): multiple definition of
DoSimulation1(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)
有什么想法吗?通常这样的错误来自于将定义放入包含文件中,或者具有奇怪的模板重载效果。这很简单,因此它不会链接可执行文件。
谢谢 - 杰夫