将可加载插件链接到Linux和Windows上可执行文件中的符号

时间:2009-12-04 00:17:09

标签: windows linux plugins bundle static-linking

它非常适用于Mac create a loadable plugin as a bundle并使其在主机可执行文件中使用符号。如何在Linux和Windows上完成?

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

关键是要远离将主机和插件链接到共享库和静态构建的主机。

5 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

您可能希望为Windows使用略有不同的模型。如果使用跨平台框架,您应该可以使用IFDEF。

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

显然, 是实现此目的的一种方法,但它是relies on a hard-coded dependency到主机可执行文件。