9

私は次の設定をしています(うまくいけば、これはあまりにも裸の例ではありません):

ああ

typedef std::map<unsigned int, float> MyClass;
extern MyClass inst;

A.cpp

MyClass inst;

Bh

#include <A.h>
void foo();

B.cpp

#include <B.h>
void foo {
    inst.myClassFunc();
}

さて、instを使用するB.cppundefined reference to inst

これを修正する方法について何かアイデアはありますか?

4

4 に答える 4

15

この質問は古いことは知っていますが、それでも誰かの役に立つかもしれません。

グローバル変数 (ここでは: MyClass inst)は、それを定義するコンパイル ユニット用であってはなりません (ここでは: )extern A.cpp

これを達成する1つの方法:

  • グローバル変数を別のヘッダー(たとえば) で宣言しglobal.h、これらを使用してこのヘッダーを *cpp に含めます。
  • それらを定義するexternコンパイル単位のキーワードを削除します (例: with ):#ifdef

global.h は次のようになります。

#ifdef A_H_
  #define EXTERN
#else
  #define EXTERN extern
#endif

EXTERN MyClass inst;

Ah は次のようになります。

#ifndef A_H_
#define A_H_

// your header content (without globals)

#endif /* A_H_ */

および A.cpp:

#include "A.h"
#include "global.h" // after A.h inclusion, we need A_H_ definition

それが役に立てば幸い!

于 2013-07-17T08:22:13.433 に答える
0

これは、何が起こっているのかを理解するにはあまりにも単純な例です。ただし、上記に基づいて、失敗した行にヒットしたときに、コンパイラーが実際に何が入っているかを認識していMyClassないため、解決できない可能性が十分にありますMyClassFunc

MyClass の定義を確認し、確実に答えられる場所を知る必要があります。

于 2010-09-07T12:11:26.243 に答える
0

上記のファイル A.cpp を次のようにコンパイルする必要があります。

g++ -c A.cpp
g++ -c B.cpp

次に、実行可能ファイルの作成中に、次のようにコマンドを記述する必要があります。

g++ A.o B.o
于 2010-09-07T12:12:42.410 に答える
0

#include <B.h>あなたが投稿した基本的なサンプルコードから、あなたは B.cpp ファイルを忘れていると思います。

于 2010-09-07T12:37:51.230 に答える