2

私は3つのファイルを持っています:myh.h; my.cpp; use.cpp。ファイルの内容は次のとおりです。

myh.h

extern int foo;
void print_foo();
void print(int);

my.cpp

#include "myh.h"
#include <iostream>
void print_foo()
{
    std::cout<<foo<<std::endl;
}
void print(int i)
{
    std::cout<<i<<std::endl;
}

use.cpp

#include "myh.h"
int main()
{
    foo=7;
    print_foo();
    print(99);
    return 0;
}

GCCは次のエラーを吐き出します:

my.o:my.cpp:(.text+0x7): undefined reference to `foo'
use.o:use.cpp:(.text+0x10): undefined reference to `foo'
collect2: ld returned 1 exit status

-cコマンドを使用してファイルをコンパイルしましたが、エラーは発生しません。次のコマンドを使用してリンクします。

g++ -o final my.o use.o

ここでの問題は何ですか、私は同様の問題を持つ他のトピックを読みました、そしてここでのケースはただ奇妙です....。

好奇心旺盛な方のために、これはStroustrupの本「C++を使用するプログラミングの原則」からの演習ドリルです。

編集: dasblinkenlightが言ったように、use.cppでfooの前にintを追加しました(これでfooが定義されました)が、それでもこのエラーが発生します:

my.o:my.cpp:(.text+0x7): undefined reference to `foo'
collect2: ld returned 1 exit status

my.cppでも定義されていないことを教えてくれますか?どこでも定義する必要がある場合、ヘッダーファイルにインクルードすることのポイントは何ですか、またはこれにどのように適切にアプローチする必要がありますか?

4

2 に答える 2

8

を宣言し たためにリンカーエラーが発生しますが、定義fooしたことはありません。

extern int foo単なる宣言です。変数にメモリが割り当てられることはなく、foo他の場所で割り当てることを約束するだけです。これを修正するには、次のように、この行をcppファイルの1つに追加する必要があります。

#include "myh.h"
int foo;
int main()
{
    foo=7;
    print_foo();
    print(99);
    return 0;
}
于 2012-12-30T02:37:48.843 に答える
3

問題は、foo宣言されているが定義されていないことです。foo正確に1つの変換単位で定義する必要があります。例:

int foo = 0;
于 2012-12-30T02:37:53.120 に答える