ocaml – 带有dynlink的加载模块重新初始化顶级值

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

但是,我似乎看到的行为是,当模块动态链接时,所有全局绑定都会重新初始化,这样我的哈希表就是空的.

例如.:

Table.extensions : (string, string -> string) Hashtbl.t
Extensions.load : unit -> unit (* loads the specified .cma files *)
Extensions.register : string -> (string -> string) -> unit
  (* adds entry to Table.extensions, prints name of extension registered *)
Main:
let () =
  Extensions.load ();
  Hashtbl.iter (fun x _ -> print_endline x) Table.extensions;
  Printf.printf "%d extensions loaded\n" (Hashtbl.length Table.extensions)

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

Registered extension 'test'
test
1 extensions loaded

相反,我得到:

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 _ -> ()

最佳答案 @ygrek,你是对的,有两个例子.

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

点赞