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