2

在 Mac 上将可加载插件创建为捆绑包并使其使用Host 可执行文件中的符号非常重要。这如何在 Linux 和 Windows 上完成?

我听说-rdynamicLinux 上可能会派上用场,但就 Windows 而言,我完全不知所措。

关键是不要将主机和插件都链接到共享库,而是转向静态构建的主机。

4

5 回答 5

1

此链接可能也是此处的解决方案: dlopen() .so failed to find symbols in a stripped executable

主要思想是对可执行文件使用链接器选项 -E (--export-dynamic)(或使用 --dynamic-list 并明确命名 DSO 可访问的符号)。

于 2013-09-25T10:41:16.140 回答
1

我经常看到的一个插件模型是在插件中调用一个初始化函数,传递给它一个结构或类,该结构或类包含宿主可执行文件中的函数指针。

于 2009-12-04T00:33:38.417 回答
0

只是为了确保我理解,您希望能够动态加载和卸载插件 DLL,这将自动解析仅在主机应用程序中定义的符号,对吗?我认为这在 Windows 下是不可能的(我不了解 Linux)。一种选择是将主机函数移动到每个人都链接到的共享静态库中,但这可能是不可能的,因为它需要提供特定于主机的功能。我认为唯一可行的选择是Zan的方法。

于 2009-12-06T16:29:06.187 回答
0

您可能希望为 Windows 使用稍微不同的模型。如果使用跨平台框架,您应该可以在 IFDEF 中使用它。

LoadLibrary 函数允许您将 DLL 的名称作为字符串传递给它。然后,您可以通过名称获取库中各种函数的地址,并将它们指向函数指针。

于 2009-12-04T00:28:03.717 回答
0

显然,有一种方法可以做到这一点,但它依赖于对主机可执行文件的硬编码依赖。

于 2009-12-07T11:44:53.947 回答