1

C(c ++ではない)コードをコンパイルしているときに、リンク時にエラーが発生します。特定の識別子が複数の場所で定義されていますが、以下に示すように、出力は非常にわかりにくいものです。

gccからより良いメッセージを取得して、どのファイルが複数の定義の原因であるかを確認する方法はありますか?

/tmp/cc8kgsLE.o:(.rodata+0x0): multiple definition of `PR_SZ'
/tmp/ccDfv6U4.o:(.rodata+0x0): first defined here
/tmp/cc8kgsLE.o:(.rodata+0x8): multiple definition of `PR_SEC_SZ'
/tmp/ccDfv6U4.o:(.rodata+0x8): first defined here
/tmp/cc8kgsLE.o:(.rodata+0x10): multiple definition of `PR_NSEC_SZ'
/tmp/ccDfv6U4.o:(.rodata+0x10): first defined here

collect2: ld returned 1 exit status

更新:応答に基づいて、、、 が、およびマクロによって保護されている1つのファイルで定義されていることPR_SZをさらに明確にします。PR_SEC_SZPR_NSEC_SZ.h#ifndef#define#endif

コンパイルに関しては、私は単に次のように入力します。

gcc -Wall -I. -file1.c file2.c -o file2

アップデート:

応答に加えて、 #defineを使用せずに以下のリンクに関連するグローバル定数を見つけました

4

2 に答える 2

4

表示される出力は私にはわかりにくいように見えますが、非常に明確です...グローバル変数(これは悪いです)PR_SZ, PR_SEC_SZ, PR_NSEC_SZは複数の.cファイルに定義されています

プロジェクトをどのようにコンパイルしますか?

ここでの主な問題は、.oファイル名が.cファイルのファイル名と一致しないことです。したがって、より良いメッセージを表示できるようにするには、Makefileまたはプロジェクトのビルドに使用しているものを改善する必要があります。

詳細については :

  • グローバル変数のプロトタイプでは.h、宣言の前にキーワード:を付ける必要があります。extern
  • 1つの.cファイルでのみ、変数は通常どおり宣言する必要があります
于 2012-12-17T17:32:26.753 に答える
2

あなたはこれを行うことができます。

ヘッダーファイル内

/* a.h */
MYEXTERN int PR_SZ; /* or whatever your variable data type is */

最初の.cファイル

/* a.c */
/* MYEXTERN doesn't evaluate to anything, so var gets defined here */
#define MYEXTERN 
#include "a.h"

他の.cファイル

/* MYEXTERN evaluates to extern, so var gets externed in all other C files */
#define MYEXTERN extern
#include "a.h"

したがって、1つの.cファイルでのみ定義され、他のすべてのファイルで外部化されます。

于 2012-12-17T17:57:44.450 に答える