Ocaml 使用dynlink加载模块可重新初始化顶级值

Ocaml 使用dynlink加载模块可重新初始化顶级值,ocaml,Ocaml,我有一个问题,我有一个全局哈希表,然后我用Dynlink加载一个.cma文件,它在哈希表中注册一个函数 然而,我似乎看到的行为是,当模块被动态链接时,所有的全局绑定都会被重新初始化,因此我的哈希表是空的 例如: 我的程序加载一个.cma文件,因此它应该打印: 相反,我得到: Registered extension 'test' 0 extensions loaded 我已经为此奋斗了几个小时;无论我如何重构我的代码,我都无法接近一个可行的解决方案 编辑:Extensions.load: Dy

我有一个问题,我有一个全局哈希表,然后我用Dynlink加载一个.cma文件,它在哈希表中注册一个函数

然而,我似乎看到的行为是,当模块被动态链接时,所有的全局绑定都会被重新初始化,因此我的哈希表是空的

例如:

我的程序加载一个.cma文件,因此它应该打印:

相反,我得到:

Registered extension 'test'
0 extensions loaded
我已经为此奋斗了几个小时;无论我如何重构我的代码,我都无法接近一个可行的解决方案

编辑:Extensions.load:

Dynlink.allow_unsafe_modules true;;

let load () =
  try
    let exts = Sys.readdir "exts" in
    Array.iter begin fun name ->
      try
        Dynlink.loadfile (Filename.concat "exts" name);
        Printf.printf "Loaded %s\n" name;
      with
        | Dynlink.Error error -> print_endline (Dynlink.error_message error)
        | exn -> print_endline (Printexc.to_string exn)
      end exts
  with _ -> ()

@伊格里克,你是对的,有两个例子


解决方案是只构建/加载
.cmo
,而不是
.cma

扩展是否在主程序使用的同一hashtbl中注册自身?也就是说,
Table.extensions
是否可能有两个实例?能否再发布一些代码?具体来说,查看
Extensions.load
正在做什么会很有帮助。Table.Extensions的两个实例?如果是这样,我将如何防止这种情况?
Registered extension 'test'
0 extensions loaded
Dynlink.allow_unsafe_modules true;;

let load () =
  try
    let exts = Sys.readdir "exts" in
    Array.iter begin fun name ->
      try
        Dynlink.loadfile (Filename.concat "exts" name);
        Printf.printf "Loaded %s\n" name;
      with
        | Dynlink.Error error -> print_endline (Dynlink.error_message error)
        | exn -> print_endline (Printexc.to_string exn)
      end exts
  with _ -> ()