使用 dlopen 加载动态库时抛出未定义的符号
Posted
技术标签:
【中文标题】使用 dlopen 加载动态库时抛出未定义的符号【英文标题】:throw undefined symbol when load dynamic lib with 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;
【参考方案1】:
由于在您的 RateComputer 类中声明了构造函数和析构函数,因此需要定义它们。
至少,您可以使用 default c++11 关键字来使用默认实现。 此外,由于您的 RateComputer 类是一个接口,因此您的 OnMarketData 方法应该是纯虚拟的,因此只能在接口中声明并在派生类中实现。
这是我最终得到的 RateComputer 类代码:
class RateComputer
public:
RateComputer() = default;
virtual ~RateComputer() = default;
virtual void OnMarketData() = 0;
;
希望这会有所帮助。
【讨论】:
以上是关于使用 dlopen 加载动态库时抛出未定义的符号的主要内容,如果未能解决你的问题,请参考以下文章
UICollectionView 使用自定义布局抛出未捕获的异常
_ctypes.cpython-39-x86_64-linux-gnu.so:未定义符号:使用 dlopen 加载的嵌入式 Python 中的 PyFloat_Type
为啥“”.abcd 返回未定义的值而不是在 Javascript 中抛出未定义的错误(但 Typescript 抛出警告)