c - AIX 6.1:警告:重複したシンボル:

c aix

Cで書かれたアプリケーションをSolaris SPARC 10からAIX 6.1に移植するのに忙しい。

WARNING: Duplicate symbol:」エラーが大量に発生しています。 #ifndefを使用して必要な場合にのみヘッダーファイルを含めようとしましたが、それでも同じ重複が取得されます。

これを引き起こすものは何ですか?私は同様の投稿を見ましたが、まだ具体的なものはありません。

例として私は得ています:

ld: 0711-224 WARNING: Duplicate symbol: onCheckCallbackFunc
ld: 0711-224 WARNING: Duplicate symbol: onCommitCallbackFunc
ld: 0711-224 WARNING: Duplicate symbol: onConfirmCallbackFunc
ld: 0711-224 WARNING: Duplicate symbol: onRollbackCallbackFunc
ld: 0711-224 WARNING: Duplicate symbol: onMessageArrivedCallbackFunc


そして、そのlibで次のコマンドを実行すると、

nm -X64 ./libtest.so

以下を取得します(単なるスニペット)

onCheck:F-1          -         692
onCheckCallbackFunc  B   536877592           8
onCheckCallbackFunc  d   536877064           8
onCheckCallbackFunc:G820 -           0
onCommit             D   536876400
onCommit             d   536876400          24
onCommit             d   536877024           8
onCommit:F-1         -         824
onCommitCallbackFunc B   536877600           8
onCommitCallbackFunc d   536877072           8
onCommitCallbackFunc:G820 -           0
onConfirm            D   536876424
onConfirm            d   536876424          24
onConfirm            d   536877032           8
onConfirm:F-1        -         956
onConfirmCallbackFunc B   536877608           8
onConfirmCallbackFunc d   536877080           8
onConfirmCallbackFunc:G820 -           0


上記でシンボルが重複しているのはなぜですか?

再度、感謝します

リントン
答え
リンカは、同じ名前のオブジェクトを含むオブジェクトファイルをリンクしようとします。

同じ名前を使用して異なるオブジェクトを明示的に宣言しなかったと仮定すると、これはおそらく同じソースを異なるオブジェクトファイルにコンパイルし、次にそれらをすべてリンカーに渡すことによって発生します。

これが発生する一般的なケースは、コンパイラーにいくつかのソースを複数回#includeさせることです。

別の可能なシナリオは、同じソースから2つのライブラリを作成し、それらをメインオブジェクトにリンクしようとすることです。

または、ライブラリとメインビルドにソースを含めます。

そのような場合、リンカーはチョークします。
関連記事

c - 定義されている場合(__AIX)はAIX 6.1で動作しませんか?

c - 「異なるサイズの整数からポインタへのキャスト」とはどういう意味ですか?

c - LIFOの順序ではなく、アドレスの順序でフリーリストを整理する利点は何ですか?

c++ - C++でのCライブラリ関数の実装

c - malloc実装での空きリストの維持

c - Cのファイルから数値を読み取る

c - すでに印刷されている改行を削除するVT100エスケープシーケンス?

c - 独自のベーシックディスクスキャナーを作成する方法

c++ - 警告—ポインターと組み合わせた算術式の不審な切り捨て

c++ - GMP整数をベースN整数に変換する