插件

对象的主要用途之一是实现 插件 . 插件是 动态载荷库 或DLL,在Unix平台上也称为共享库。

Felix可以在运行时加载dll。但是插件是具有特定结构的特殊dll。

加载插件

要加载一个名为“obüu implementation”的插件,请执行以下操作:

var joe =
   Dynlink::load-plugin-func1
     [ob_t,string]
     ( dll-name="ob_implementation", setup-str="")
;

这个 load-plugin-func1 加载一个以DLL为基名的插件“obüu implementation”,通过调用函数初始化全局内存 setup_ob_implementation 并将空字符串“”传递给它,然后调用入口点函数 ob_implementation 它接受类型的值 string 返回和类型 ob_t .

将在环境变量给定的标准操作系统搜索路径上搜索DLL LD_LIBRARY_PATH 在Linux上, DYLD_LIBRRY_PATH 在MacOSX上 PATH 在窗户上。每个平台的标准扩展被附加,即 .so 在Linux上, .dylib 在MacOSX上 .dll 在Windows上。

加载操作使用操作系统加载函数的包装: dlopen 在Linux和MacOSX上,以及 LoadLibrary 在Windows上。

然后系统使用符号查找功能查找 setup . 它使用 dlsym 在Linux和MacOSX上 LoadAddress 在窗户上。它必须是C函数,而不是C++函数,它必须接受C++字符串作为参数,并返回int。

然后系统找到入口点,它必须是一个C函数,它接受string类型的值,并返回类型的值 ob_t . 函数的返回类型和参数类型在调用中的方括号中给出 load-plugin-func1 .

这里最重要的是 ob_t 对于插件代码和客户端代码都是已知的。因此,通常将接口规范放在一个单独的文件中,并将它包含在两个地方,就像C和C++中的头文件一样。加载时没有进行类型检查,因此如果接口更改以重建插件和客户端,这一点很重要。

因为插件通常提供很多函数,而不仅仅是一个,我们通常只提供一个函数和对象工厂,当调用时,它将返回一组打包到记录中的函数。