OCaml - 将程序编译为库

sin*_*nan 3 ocaml

我有一个OCaml程序(使用main方法 - 它生成一个可执行文件),我想将它用作库.

我正在编译我的程序:ocamlc -I someDir -g -unsafe lotsOfCmoFiles -o outputFile这个程序运行正常.

现在我删除使它成为可执行文件的行(类似于let _ = ...)-a并向compile命令添加参数:ocamlc -a -I someDir -g -unsafe lotsOfCmoFiles -o outputFile.cma

但不知怎的,我无法加载生成的.cma文件ocamltopocamlbrowser显示一个空列表.当我尝试加载时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)

cag*_*ago 8

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)