在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平台上可能有类似的系统吗?
答案 0 :(得分:1)
在C ++代码中,我试图拥有一个定义多态基类的主模块,该基类将在运行时为其动态加载派生类。
到目前为止,太好了。当心所有常见的警告-其中包括:
在编译插件时使用相同的编译器和库版本。至少要确保ABI兼容。
在Windows上执行此操作时,链接到共享的c ++运行时。
窗口在声明中将需要ddlexport
/ dllimport
属性。
使用-fPIC
请确保延迟加载符号名称,以避免冲突(例如,如果2个共享库具有名为make_a
的导出函数。
这样的系统在Linux上是否可以运行,而无需其他有关动态链接的步骤?
是
在Windows平台上可能有类似的系统吗?
是的。再次,请注意并进行一些研究。
这里有一些好的答案:Is there an elegant way to avoid dlsym when using dlopen in C?