我有一个主程序,它有一个需要共享库使用的基类。 基类有一些纯虚方法,共享库中的派生类需要重写。 主程序使用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;
}
答案 0 :(得分:1)
由于在RateComputer类中声明了构造函数和析构函数,因此需要对它们进行定义。
至少,您可以使用 default c ++ 11关键字来使用默认实现。 此外,由于您的RateComputer类是一个接口,因此您的OnMarketData方法应该是纯虚拟的,因此只能在接口中声明并在派生类中实现。
这是我最终得到的RateComputer类代码:
class RateComputer
{
public:
RateComputer() = default;
virtual ~RateComputer() = default;
virtual void OnMarketData() = 0;
};
希望这有帮助。