【问题标题】:throw undefined symbol when load dynamic lib with dlopen使用 dlopen 加载动态库时抛出未定义的符号
【发布时间】:2017-08-21 10:35:32
【问题描述】:

我的主程序有一个共享库需要使用的基类。 基类有一些纯虚方法,共享库中的派生类需要重写。 主程序使用 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;
}

【问题讨论】:

  • 这些方法在哪里实现?
  • 重要吗?
  • 是的,它实际上比声明更重要。
  • 当有某种RateComputer.cpp 包含RateComputer::RateComputer(void)RateComputer::~RateComputer(void) 的实现被编译为主要可执行文件的一部分,而库实现@987654328 @ 仅包含 WeightedRateComputer 方法的实现,并且仅使用带有 RateComputer 声明的标头?
  • RateCompiter 是一个抽象类。 RateComputer::RateComputer(void)RateComputer::~RateComputer(void) 都必须实现,因为它们将被 WeightedRateComputer 构造函数和析构函数调用。 OnMarketData() = default; 也应该是 OnMarketData() = 0;

标签: c++ dynamic


【解决方案1】:

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

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

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

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

};

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2012-01-11
    • 2012-09-27
    • 2010-10-03
    • 1970-01-01
    • 1970-01-01
    • 2012-04-07
    • 2018-03-19
    • 1970-01-01
    • 2021-03-08
    相关资源
    最近更新 更多