4

ソース ファイルmain.csecond.cの間でいくつかの共有変数にアクセスする必要があり、私のヘッダー ファイルは共有データ型を定義するall.hです。

#ifndef ALL_H
#define ALL_H
struct foo {
    double v;
    int i;
};

struct bar {
    double x;
    double y;
};
#endif

main.cを以下に示します

/* TEST*/
#include "all.h"
#include "second.h"

int main(int argc, char* argv[])
{
    struct foo fo; // should be accessed in second.c
    fo.v= 1.1;
    fo.i = 12;

    struct bar ba; // should be accessed in second.c
    ba.x= 2.1;
    ba.y= 2.2;

    sec(); // function defined in second.c

    return 0;
}

second.hを以下に示します

#include <stdio.h>
#include "all.h"

int sec();

second.cを以下に示します

#include "second.h"

extern struct foo fo;
extern struct bar ba;

int sec()
{
    printf("OK is %f\n", fo.v+ba.x);

    return 0;
}

すべての宣言があり、ヘッダーが含まれていると思いました。しかし、私がコンパイルするとき

    gcc -o main main.c second.c 

or 

    gcc -c second.c
    gcc -c main.c
    gcc -o main main.o second.o

次のようなエラーが発生します

second.o: In function `sec':
second.c:(.text+0x8): undefined reference to `fo'
second.c:(.text+0xe): undefined reference to `ba'
collect2: ld returned 1 exit status

externの使用のどこかが間違っていたと思いますか、それとも間違って使用しgccていますか?

4

3 に答える 3

6

問題はスコープにあります。変数 ( fo& ba) は 内で宣言されているため、ローカル スコープを持っています。mainそのため、それらの可視性はmain関数内に制限されています。それらをグローバル変数にしてください。動作するはずです。

于 2012-07-19T08:58:52.103 に答える
3

このエラー メッセージは、リンカが と を見つけられないことを示していfoますba。宣言によりextern、変数が他の翻訳単位に存在することをコンパイラーに伝えましたが、存在しません。

struct foo fo;andを関数struct bar ba;の外に移動する必要がありmain()ます。現在、それらは関数ローカル変数です。これが機能するには、グローバル変数である必要があります。

于 2012-07-19T08:59:17.187 に答える