2017-08-21 14 views
0

共有ライブラリで使用する必要がある1つの基本クラスを持つメインプログラムを持っています。 基本クラスには、共有ライブラリの派生クラスを上書きする必要がある、純粋な仮想メソッドがあります。 メインプログラムは、dlopenシステムコールを使用して共有ライブラリをロードします。 dlopen( "共有ファイル名"、RTLD_NOW | RTLD_GLOBAL);共有ライブラリ内dlopenでダイナミックlibをロードするときに未定義のシンボルを投げる

基本クラス

class RateComputer 
{ 
    public: 
    RateComputer(); 
    virtual ~RateComputer(); 
    virtual void OnMarketData() = default; 
    private: 
    }; 

派生クラス。

class WeightedRateComputer : public RateComputer 
    { 
    public: 
    WeightedRateComputer(); 
    ~WeightedRateComputer(); 
    void OnMarketData() override; 
    private: 
}; 

とバイナリのコンパイルながら

を実装するので、私は-rdynamicフラグを追加したファイル。しかし、ライブラリをdlopenでロードすると、 "undefined symbol:_ZTI12RateComputer"というエラーが発生します。

int main() 
{ 
    void *handle = dlopen("../xx.so", RTLD_LAZY |RTLD_GLOBAL); 
    if (handle == NULL) 
    { 
     printf("%s\n", dlerror()); //throw error here 
     return 0; 
    } 
    return 0; 
} 
+0

これらのメソッドはどこに実装されていますか? – VTT

+0

それは重要ですか? – sundq

+1

はい、実際は宣言よりも重要です。 – VTT

答えて

1

コンストラクタとデストラクタは、RateComputerクラスで宣言されているため、定義する必要があります。

少なくとも、デフォルトの C++ 11キーワードを使用して、デフォルト実装を使用できます。 さらに、RateComputerクラスがインターフェイスであるため、OnMarketDataメソッドは純粋な仮想クラスである必要があります。したがって、インターフェイスでのみ宣言され、派生クラスで実装されます。このことができます

class RateComputer 
{ 
    public: 
    RateComputer() = default; 
    virtual ~RateComputer() = default; 
    virtual void OnMarketData() = 0; 

}; 

希望:

は、ここで私はで終わるRateComputerクラスコードです。

関連する問題