gpt4 book ai didi

c++ - 使用 dlopen 加载派生多态类

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:34:04 34 4
gpt4 key购买 nike

在 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 平台上是否可能有类似的系统?

最佳答案

In a C++ code I'm trying to have a main module that defines a polymorphic base class, which dynamically loads derived classes for it at runtime.

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

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

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

  • windows 将要求在声明中使用 ddlexport/dllimport 属性。

  • 使用-fPIC编译linux共享库

  • 一定要延迟加载符号名称以避免冲突(例如,如果 2 个共享库有一个名为 make_a 的导出函数。

Will a system like this work on Linux, without additional steps regarding the dynamic linking?

And is a similar system possible on Windows platform?

是的。同样,请查看注意事项并进行一些研究。

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

关于c++ - 使用 dlopen 加载派生多态类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52539029/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com