GNAT 示例/插件:没有 dlsym() 的 lib 函数调用?
GNAT examples / plugins: lib function call without dlsym()?
README.testing 说
Then 'demo' will use Plugins.Call to
- retrieve an access to a symbol in the dynamic library using the dlsym() routine.
Plugins.Call 是唯一调用 dlsym 的子程序。现在:
- grep 在除插件源之外的任何源文件中都找不到“调用”
- 放在 Call 末尾的 Put_Line 永远不会产生任何输出
- 放在Plugins.Load末尾的Put_Line产生输出,所以我在正确的包中摸索(plugins_unix.adb)。
简而言之:它有效,但我不知道为什么。如何在不使用 dlsym 的情况下调用在 运行 时间加载的库中的函数?
终于明白方案了
诀窍是主程序从不调用插件的函数!它只使用 dlopen 加载插件(库)。
所有插件都是抽象基类型的后代,每个插件在其包体中声明了 2 个全局变量:
- class 宽类型之一(到基本类型)
- 一个受控变量(Limited_Controlled 有空记录)
相应的覆盖初始化过程:
- 调用构造函数并将结果赋给第一个变量
- 从引入这个新对象的主程序调用注册子程序。
然后主程序可以调用对象的所有方法,它从抽象基类型中知道这些方法。
所以简而言之,插件在库是时生成一个对象
加载,主程序的行为就像“我们不会打电话给你,打电话给我们。”
README.testing 说
Then 'demo' will use Plugins.Call to
- retrieve an access to a symbol in the dynamic library using the dlsym() routine.
Plugins.Call 是唯一调用 dlsym 的子程序。现在:
- grep 在除插件源之外的任何源文件中都找不到“调用”
- 放在 Call 末尾的 Put_Line 永远不会产生任何输出
- 放在Plugins.Load末尾的Put_Line产生输出,所以我在正确的包中摸索(plugins_unix.adb)。
简而言之:它有效,但我不知道为什么。如何在不使用 dlsym 的情况下调用在 运行 时间加载的库中的函数?
终于明白方案了
诀窍是主程序从不调用插件的函数!它只使用 dlopen 加载插件(库)。
所有插件都是抽象基类型的后代,每个插件在其包体中声明了 2 个全局变量:
- class 宽类型之一(到基本类型)
- 一个受控变量(Limited_Controlled 有空记录)
相应的覆盖初始化过程:
- 调用构造函数并将结果赋给第一个变量
- 从引入这个新对象的主程序调用注册子程序。
然后主程序可以调用对象的所有方法,它从抽象基类型中知道这些方法。
所以简而言之,插件在库是时生成一个对象 加载,主程序的行为就像“我们不会打电话给你,打电话给我们。”