在我的场景中,我想要一个插件,它是一个在运行时加载的共享对象,可以从“主机应用程序”访问符号,这样我就可以向我的应用程序添加任何功能。
我试过但没有找到任何方法来做到这一点,我不知道这是否可能。那么,我能否以某种方式做到这一点,或者使用插件的应用程序是否有任何替代方案?
我在 Fedora 15、Linux 2.6.4 上。但是,我希望该解决方案是跨平台的。
最佳答案
主要有以下三种方法:
将函数指针结构从应用程序传递到 DLL,从而可以访问您想要共享的任何符号。这是最可移植的方法,但是创建所有函数指针有点麻烦。像这样的东西:
// In shared header struct app_vtable { void (*appFoo)(); }; // In plugin: const app_vtable *vt; void set_vtable(const app_vtable *vt_) { vt = vt_; } void bar() { vt->appFoo(); } // In application: void foo(); const app_vtable vt = { foo }; void loadplugin() { void *plugin = dlopen("plugin.so", RTLD_LAZY); void (*pset_vtable)(const app_vtable *) = dlsym(plugin, "set_vtable"); pset_vtable(&vt); void (*pbar)() = dlsym(plugin, "bar"); pbar(); }
将您的应用程序移动到一个库中,让可执行文件简单地链接到这个库中并调用其中的一个入口点。然后你的插件可以链接同一个库并轻松访问它的符号。这也非常便携,但由于需要在主应用程序库中使用与位置无关的代码,因此可能会导致一些性能损失(尽管在这种情况下,您可以使用固定映射,具体取决于您的架构) .
- 仅在 Linux(以及可能的其他 ELF 平台)上,您可以使用
-rdynamic
直接从应用程序可执行文件中导出符号。然而,这对其他平台的移植性不是很好 - 特别是,这些与 Windows 上的不等同。
关于c++ - 我可以从运行时加载的共享对象访问主机进程的符号吗?还有其他选择吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7706592/