1

既に動作しているコードがありますが、それをさらに別の Linux プラットフォームに移植する必要があります。私は常に gcc/g++ の違いに合わせてコードを調整する必要があります。通常、指定された g++ のバージョンは、許可される内容がより制限されています。

この場合、非常に単純なケースで複数の関数定義エラーが発生しています。単一の cpp ファイル内の単一のグローバル関数が 1 回呼び出されています。最後の g++ リンク行に、オブジェクト ファイルの重複リストはありません。ソース ファイル テキスト (検索による) またはコンパイル済みオブジェクト ファイル (objdump -t を使用) のいずれにも重複はありません。実際、エラーは、オブジェクトに同じオフセットをリストすることにより、真の重複がないことを確認します。

実際のリンク エラー: Simulation1.o: 関数DoSimulation1(int, char**)': Simulation1.cpp:(.text+0x1800): multiple definition of内 DoSimulation1(int, char**)' Simulation1.o:Simulation1.cpp:(.text+0x1800): ここで最初に定義

2 つの奇妙なことに注意してください - (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 シム

ファイル 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

リンクコマンドに2つあるからでしょ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 シム

(copy.oも重複しているようです)

于 2013-06-07T23:25:08.910 に答える