我有一个OCaml程序(使用main方法 - 它生成一个可执行文件),我想将它用作库.
我正在编译我的程序:ocamlc -I someDir -g -unsafe lotsOfCmoFiles -o outputFile这个程序运行正常.
现在我删除使它成为可执行文件的行(类似于let _ = ...)-a并向compile命令添加参数:ocamlc -a -I someDir -g -unsafe lotsOfCmoFiles -o outputFile.cma
但不知怎的,我无法加载生成的.cma文件ocamltop并ocamlbrowser显示一个空列表.当我尝试加载时ocamltop:
# #load "outputFile.cma";;
Error: Reference to undefined global `Xyz'
Run Code Online (Sandbox Code Playgroud)
而且我100%确定xyz.cmo包含在内lotsOfCmoFiles.
编译时我给出了一些参数错误吗?或者,我应该怎么做才能在ocamltop中加载我的程序?(我将在另一个程序中使用这个库,我以ocamltop输出为例)
任何帮助将不胜感激.
编辑:所以我终于可以设法编译并加载它感谢@cago,现在我可以加载我的库,当我不删除主线时,let _ = ...它会在我加载时自动运行.cma.
但我仍然无法打开任何模块.奇怪的是,这不会引发异常
open Main
Run Code Online (Sandbox Code Playgroud)
但是当我从模块Main调用一个函数时:
# someFun;;
Error: Reference to undefined global `Main'
Run Code Online (Sandbox Code Playgroud)
并ocamlbrowse仍显示一个空列表.现在为什么呢?
EDIT2:我意识到open Main没有失败,因为我在同一个文件夹中有一个Main模块(即使我没有明确加载它).如果我将.cma文件移动到其他地方并加载它,它就可以工作(即主函数自动运行),但现在即使ocamlobjinfo显示模块也无法打开任何模块.
编辑3: - 我没有帮助:
$ ocaml
OCaml version 4.00.1
# #load "lib.cma";;
ok
# open Lib;;
Error: Unbound module Lib
#
$ ocaml -I libFolder
OCaml version 4.00.1
# #load "toylib.cma";;
ok
# open Lib;;
# fun;;
Error: Reference to undefined global `Lib'
Run Code Online (Sandbox Code Playgroud)
你lotsOfCmoFiles需要知道一些cmo 模块Xyz.您需要处理cmo文件之间的依赖关系.
例如:
toto.ml:
let x = "toto"
Run Code Online (Sandbox Code Playgroud)
titi.ml:
let y = Toto.x ^ " titi"
ocamlc -c toto.ml
ocamlc -c titi.ml
ocamlc -a titi.cmo toto.cmo -o lib.cma (* here is the probleme *)
# #load "lib.cma"
Error: Reference to undefined global `Toto'
Run Code Online (Sandbox Code Playgroud)
因为titi取决于toto所以你需要改变cmos的顺序:
ocamlc -a toto.cmo titi.cmo -o lib.cma
# #load "lib.cma"
# Titi.y;;
- : string = "toto titi"
Run Code Online (Sandbox Code Playgroud)
编辑:
例如,如果您的cma位于子目录中,则在调用ocaml时需要指定路径:
ocaml -I subdir/ (* subdir which contains lib.cma *)
# #load "lib.cma"
# Toto.x;;
- : string = "toto"
Run Code Online (Sandbox Code Playgroud)