6

私はデータ型を持っており、その型の変数をインスタンス化できます。このような:

FetchAddr faddr(VirtualMemoryAddress( 0x0a ));

FetchAdrの定義は次のとおりです。

struct FetchAddr {
   VirtualMemoryAddress theAddress;
   FetchAddr(VirtualMemoryAddress anAddress)
     : theAddress(anAddress)
   { } 
};

これで、faddrがプライベート(またはパブリック)変数であるクラスができました。

class FLEXUS_COMPONENT(BPred)  {
   static FetchAddr faddr;
   public:
     FLEXUS_COMPONENT_CONSTRUCTOR(BPred)
        : base( FLEXUS_PASS_CONSTRUCTOR_ARGS )
     {
        faddr = VirtualMemoryAddress( 0x0a );
     }
   ...
}

マクロが適切に定義されていると仮定します。

コードは問題なくコンパイルおよびリンクされます。ただし、プログラムを開始すると、次のように表示されます。

 "undefined symbol: _ZN6nBPred14BPredComponent8faddr"

faddrの記号がないことを示しています。

それについて何か考えはありますか?

4

3 に答える 3

4

静的メンバーを宣言するときは、.cppファイルなどのどこかでそれを定義する必要もあります。また、このファイルにリンクすることを忘れないでください。


問題番号2-FetchAddrデフォルトのコンストラクターがありません。

クラスの静的メンバーとして持つ必要がある場合faddrは、定義時に次のような値も指定する必要があります。

FetchAddr FLEXUS_COMPONENT(BPred)::faddr(VirtualMemoryAddress( 0x0a ));

これにより、すべてのオブジェクトfaddrで共有されるが作成されます。FLEXUS_COMPONENT(BPred)

各オブジェクトが変数の独自のコピーを持っているということをお望みなら、faddrそれを非静的にして、コンストラクターで初期化することができます。

class FLEXUS_COMPONENT(BPred)  {
   FetchAddr faddr;
   public:
     FLEXUS_COMPONENT_CONSTRUCTOR(BPred)
        : base( FLEXUS_PASS_CONSTRUCTOR_ARGS ),
          faddr(VirtualMemoryAddress( 0x0a ))
     { }
   // ...
};
于 2011-07-31T12:41:03.863 に答える
3

静的変数は他の場所で定義する必要があります。

FetchAddr FLEXUS_COMPONENT(BPred) :: faddr;

単一のTUで。

于 2011-07-31T12:39:22.787 に答える
2

-Wl,--no-undefinedライブラリまたはその他の依存関係で定義されていないシンボルが1つでもある場合でも、リンカがリンクの完了を拒否するように、でコンパイルしてみてください。

faddr適切にリンクされておらず、プログラムをもっと見ることなく、他に何が起こっているのかを知ることは困難です。

于 2011-07-31T12:55:00.937 に答える