我有一个 OCaml 程序(带有一个 main 方法 - 它生成一个可执行文件),我想将它用作一个库。
我正在像这样编译我ocamlc -I someDir -g -unsafe lotsOfCmoFiles -o outputFile
的程序:并且程序运行良好。
现在我正在删除使其成为可执行文件的行(类似于let _ = ...
)并将-a
参数添加到编译命令:ocamlc -a -I someDir -g -unsafe lotsOfCmoFiles -o outputFile.cma
但不知何故,我无法加载生成的 .cma 文件ocamltop
并ocamlbrowser
显示一个空列表。当我尝试从以下位置加载时ocamltop
:
# #load "outputFile.cma";;
Error: Reference to undefined global `Xyz'
而且我 100% 确定 xyz.cmo 包含在lotsOfCmoFiles
.
我在编译时是否给了一些错误的参数?否则,我应该怎么做才能在 ocamltop 中加载我的程序?(我将在另一个程序中使用这个库,我以 ocamltop 输出为例)
任何帮助将不胜感激。
编辑:所以感谢@cago,我终于可以编译和加载它,现在我可以加载我的库,当我不删除主线let _ = ...
时,它会在我加载.cma
.
但我仍然无法打开任何模块。奇怪的是,这并没有引发异常
open Main
但是当我从模块 Main 调用一个函数时:
# someFun;;
Error: Reference to undefined global `Main'
并且ocamlbrowse
仍然显示一个空列表。现在为什么呢?
EDIT2:我意识到open Main
不会失败,因为我在同一个文件夹中有一个主模块(即使我没有明确加载它)。如果我将 .cma 文件移动到其他地方并加载它,它可以工作(即 main 函数自动运行),但现在我无法打开任何模块,即使ocamlobjinfo
显示了模块。
EDIT3:-我没有帮助:
$ 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'