gpt4 book ai didi

ocaml - 尝试使用 Dynlink 动态加载模块

转载 作者:行者123 更新时间:2023-12-01 06:55:57 25 4
gpt4 key购买 nike

我正在尝试使用 Dynlink 设置 OCaml 模块的动态加载。我写了一个非常简单的测试程序,但它不工作。

本测试程序由Plug和Ext两个模块组成。插头是“主要”模块。它知道 Ext 的文件名并使用 Dynlink.loadfile 加载它。 Ext 引用 Plug,并调用 Plug 中的一个函数,该函数通知 Plug 关于它的一个函数,以便它可以被调用。 Plug加载Ext后,调用Ext应该注册的函数。

如果我编写的 Ext 模块不执行任何代码,那么它会成功加载。但是,如果我包含使用 Plug 注册其扩展函数的部分,则会出现错误:The module 'Plug' is not yet initialized

我不明白为什么 Plug 还不能初始化,因为它已经在执行了。 (其实我不知道初始化一个OCaml模块是什么意思。)

我已将代码减少到几乎不需要重现问题的程度。我在 Linux 上使用 OCaml 4.01.0。

这是主要模块:

(* plug.ml *)

type xfn = string -> unit

let dummy_func str =
print_endline ("Dummy: " ^ str)

let ext_func : xfn ref = ref dummy_func

let register func =
ext_func := func

let call () =
(!ext_func) "calling"

(* load extension *)

let () =
try
print_endline "Loading ext.";
Dynlink.loadfile "ext.cmo";
print_endline "Loaded ext.";
()
with
| Dynlink.Error e ->
print_endline (Dynlink.error_message e);
print_endline "Calling registered func.";
call ()

这是扩展文件:

(* ext.ml *)

open Plug

let myext str =
print_endline ("Ext: " ^ str)

let () = Plug.register myext

我使用这个 shell 脚本来编译可执行文件:

#!/bin/sh
ocamlc -c plug.ml && \
ocamlc -c ext.ml && \
ocamlc -o plug dynlink.cma plug.cmo ext.cmo \
|| exit 1

这是我得到的输出:

Loading ext.
error while linking ext.cmo.
The module `Plug' is not yet initialized
Calling registered func.
Dummy: calling

最佳答案

在这种情况下,我的搜索引擎技能似乎不尽如人意。

更多的挖掘发现了一个存档的电子邮件链,其中指出引用的模块(在本例中为 Plug)必须在动态加载的模块调用它之前已经完全评估。

解决方案是将加载扩展模块的代码和扩展模块调用的代码分离成两个独立的模块(所以现在一共是三个模块)。

关于ocaml - 尝试使用 Dynlink 动态加载模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22395113/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com