使用 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

为啥这段代码没有抛出未定义的属性 PHP 通知?

为啥“”.abcd 返回未定义的值而不是在 Javascript 中抛出未定义的错误(但 Typescript 抛出警告)

原型属性抛出未定义 [重复]

bootstrap-datepicker 抛出未定义的 jQuery