ヘッダーで変数を定義し、それを 2 つの異なるソース ファイルに含めたようです。
まず、何かを宣言すること (どこかに存在することを宣言すること) と定義すること (実際に作成すること)の違いを理解する必要があります。次のファイルがあるとします。
header.h:
void printIt(void); // a declaration.
int xyzzy; // a definition.
main.c:
#include "header.h"
int main (void) {
xyzzy = 42;
printIt();
return 0;
}
other.c:
#include <stdio.h>
#include "header.h"
void printIt (void) { // a definition.
printf ("%d\n", xyzzy);
}
C プログラムをコンパイルすると、ヘッダーを含めることによって両方で効果的に定義したため、結果のオブジェクト ファイルのそれぞれに変数が呼び出されます。xyzzy
つまり、リンカーが 2 つのオブジェクトを結合しようとすると、複数の定義の問題が発生します。
解決策は、次のように、ヘッダー ファイルで宣言し、C ファイルで定義することです。
header.h:
void printIt(void); // a declaration.
extern int xyzzy; // a declaration.
main.c:
#include "header.h"
int xyzzy; // a definition.
int main (void) {
xyzzy = 42;
printIt();
return 0;
}
other.c:
#include <stdio.h>
#include "header.h"
void printIt (void) { // a definition.
printf ("%d\n", xyzzy);
}
そうすれば、それが存在するother.c
ことを知っていますが、それを作成するだけです。xyzzy
main.c