使用 dlopen 加载派生多态 class
Loading derived polymorphic class using dlopen
在 C++ 代码中,我试图拥有一个定义多态基础 class 的主模块,它在运行时为其动态加载派生的 classes。主模块有这样的东西:
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()
,访问[=的v-table 17=]。即使没有显式加载这些符号,这仍然有效吗?
在 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. 上执行此操作时,Link 到共享的 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++ 代码中,我试图拥有一个定义多态基础 class 的主模块,它在运行时为其动态加载派生的 classes。主模块有这样的东西:
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()
,访问[=的v-table 17=]。即使没有显式加载这些符号,这仍然有效吗?
在 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. 上执行此操作时,Link 到共享的 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?