既に動作しているコードがありますが、それをさらに別の 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)
何かご意見は?通常、このようなエラーは、インクルード ファイルに定義を入れたり、奇妙なテンプレートのオーバーロード効果が原因で発生します。これは非常に単純で、結果として実行可能ファイルをリンクしません。
ありがとう - ジェフ