使用dlopen加载派生的多态类

时间:2018-09-27 14:10:17

标签: c++ linux linker dynamic-linking dlopen

在C ++代码中,我试图拥有一个定义多态基类的主模块,该基类在运行时为其动态加载派生类。主模块的内容如下:

class Base {
public:
    virtual ~Base();
    virtual int f() = 0;
};

int main() {
    auto make_a_ptr = /* load function pointer make_a from module using dsym */;
    Base* a = make_a_ptr();
    std::cout << a->f() << std::endl;
    delete a;
}

动态加载的外部模块具有:

class A : public Base {
public:
    int f() {
        return 123;
    }
};

extern "C" Base* make_a() {
    return new A;
}

这样的系统在Linux上是否可以运行,而无需其他有关动态链接的步骤?因为此处仅使用make_a显式加载dlsym(),但是主模块还将调用A::f()A::~A(),并访问A的v表。即使未显式加载这些符号,这仍然有效吗?

在Windows平台上可能有类似的系统吗?

1 个答案:

答案 0 :(得分:1)

  

在C ++代码中,我试图拥有一个定义多态基类的主模块,该基类将在运行时为其动态加载派生类。

到目前为止,太好了。当心所有常见的警告-其中包括:

  • 在编译插件时使用相同的编译器和库版本。至少要确保ABI兼容。

  • 在Windows上执行此操作时,链接到共享的c ++运行时。

  • 窗口在声明中将需要ddlexport / dllimport属性。

  • 使用-fPIC

  • 编译linux共享库
  • 请确保延迟加载符号名称,以避免冲突(例如,如果2个共享库具有名为make_a的导出函数。

  

这样的系统在Linux上是否可以运行,而无需其他有关动态链接的步骤?

  

在Windows平台上可能有类似的系统吗?

是的。再次,请注意并进行一些研究。

这里有一些好的答案:Is there an elegant way to avoid dlsym when using dlopen in C?