在我的场景中,我想要一个插件,它是在运行时加载的共享对象,用于访问“主机应用程序”中的符号,以便我可以向我的应用程序添加任何功能。
我已经尝试过,但没有找到任何方法来做到这一点,而且我不知道这是否可能。那么,我可以以某种方式做到这一点,或者使用插件的应用程序是否有任何替代方案?
我使用的是 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 上的平台不同。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)