代码之家  ›  专栏  ›  技术社区  ›  tmlen

使用dlopen加载派生多态类

  •  1
  • tmlen  · 技术社区  · 7 年前

    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

    在Windows平台上也可以使用类似的系统吗?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Richard Hodges    7 年前

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

    到目前为止,还不错。注意所有常见的警告-其中包括:

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

    • windows将需要 ddlexport / dllimport 声明的属性。

    • 用-fPIC编译linux共享库

    • 请确保延迟加载符号名称,以避免冲突(例如,如果两个共享lib有一个名为 make_a .

    像这样的系统能在Linux上工作吗,而不需要关于动态链接的额外步骤?

    是的

    在Windows平台上也可以使用类似的系统吗?

    对。再次,请参阅注意事项并进行一些研究。

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