使用dlopen加载动态库时抛出未定义的符号

时间:2017-08-21 10:35:32

标签: c++ dynamic

我有一个主程序,它有一个需要共享库使用的基类。 基类有一些纯虚方法,共享库中的派生类需要重写。 主程序使用dlopen系统调用加载共享库。 dlopen(“共享文件名”,RTLD_NOW | RTLD_GLOBAL);

基础课程

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

共享库中的派生类。

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

并实施

WeightedRateComputer::WeightedRateComputer()
{
    printf("in Construct\n");
}

void WeightedRateComputer::OnMarketData()
{
    printf("in OnMarketData\n");
}


extern "C" WeightedRateComputer* createObj()
{
    return new WeightedRateComputer();
}

在编译二进制文件时,我添加了-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;
}

1 个答案:

答案 0 :(得分:1)

由于在RateComputer类中声明了构造函数和析构函数,因此需要对它们进行定义。

至少,您可以使用 default c ++ 11关键字来使用默认实现。 此外,由于您的RateComputer类是一个接口,因此您的OnMarketData方法应该是纯虚拟的,因此只能在接口中声明并在派生类中实现。

这是我最终得到的RateComputer类代码:

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

};

希望这有帮助。