GNAT 示例/插件:没有 dlsym() 的 lib 函数调用?

GNAT examples / plugins: lib function call without dlsym()?

README.testing 说

Then 'demo' will use Plugins.Call to

  1. retrieve an access to a symbol in the dynamic library using the dlsym() routine.

Plugins.Call 是唯一调用 dlsym 的子程序。现在:

简而言之:它有效,但我不知道为什么。如何在不使用 dlsym 的情况下调用在 运行 时间加载的库中的函数?

终于明白方案了

诀窍是主程序从不调用插件的函数!它只使用 dlopen 加载插件(库)。

所有插件都是抽象基类型的后代,每个插件在其包体中声明了 2 个全局变量:

  1. class 宽类型之一(到基本类型)
  2. 一个受控变量(Limited_Controlled 有空记录)

相应的覆盖初始化过程:

  1. 调用构造函数并将结果赋给第一个变量
  2. 从引入这个新对象的主程序调用注册子程序。

然后主程序可以调用对象的所有方法,它从抽象基类型中知道这些方法。

所以简而言之,插件在库是时生成一个对象 加载,主程序的行为就像“我们不会打电话给你,打电话给我们。”