2017-08-21 41 views
0

我有一個主程序,它有一個基類需要被共享庫使用。 基類有一些純粹的虛擬方法,必須覆蓋共享庫中的派生類。 主程序使用dlopen系統調用加載共享庫。 dlopen(「共享文件名」,RTLD_NOW | RTLD_GLOBAL);當使用dlopen加載動態庫時拋出未定義的符號

基類

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

在共享庫派生的類。

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

和實施

雖然二進制編譯等文件我已經添加-rdynamic標誌。但是在使用dlopen加載庫時,它會給出錯誤「未定義符號:_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方法應該是純虛擬的,因此只能在接口中聲明並在派生類中實現。

這裏的RateComputer類的代碼,我結束了:

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

}; 

希望這有助於。

相關問題