【发布时间】: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;