3

私は現在、最初の「本格的な」C プロジェクトである 16 ビット VM に取り組んでいます。ファイルを 1 つの大きなソース ファイルから複数のソース ファイルに分割すると、リンカー (clang、gcc、cc、または ld を介して呼び出されたもの) が次のエラーを吐き出します。

ld: duplicate symbol _registers in register.o and main.o for inferred 
    architecture x86_64

registersメインファイルのどこにも宣言はありません。それがuint16_t役立つ場合は配列です。私は組み込みのコンパイラ (GNU gcc ではない) を使用して Mac OS 10.7.3 を使用しています。何か助けはありますか?

4

1 に答える 1

13

ヘッダーで変数を定義し、それを 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ことを知っていますが、それを作成するだけです。xyzzymain.c

于 2013-08-13T08:26:14.277 に答える