OCaml编译#use错误

时间:2015-04-11 02:20:51

标签: ocaml

我正在尝试使用调试器标志-g编译OCaml文件,文件中包含以下行 - #use" file2.ml"。为什么只要我有use关键字就不能编译文件? "#使用"到底是什么?关键字吗?还有其他选择吗?

3 个答案:

答案 0 :(得分:1)

仅以顶级的OCaml解释器(也称为读取 - 评估 - 打印循环)支持以#开头的指令。

在顶层,#use使解释器从文本文件中读取OCaml代码。之后它继续以交互方式接受命令。

对于已编译的代码,您应该单独编译然后将模块链接在一起。如果file2.ml中的代码不能形成完整模块,您可能希望将其直接剪切/粘贴到主文件中。 OCaml没有像C系列那样的编译时源文件包含。

<强>更新

以下是如何以旧学校的方式编译两个OCaml文件。你会发现有些人说这些方法已经过时,你应该学会使用ocamlbuild。这可能是正确的,但至少我现在已经老了。

$ ocamlc -o program file2.ml file1.ml

您必须按依赖顺序列出.ml个文件,即在它使用的任何文件之后必须列出文件。这已经成为使用更强大的构建工具的一个原因。

请注意,这与#use的行为不同,file2.mlfile2.ml的所有顶级名称加载到全局名称空间中。通过单独编译,File2中的名称将包含在名为f的模块中。如果您要调用file2.ml中定义的函数File2.f,则应将其称为{{1}}。

答案 1 :(得分:0)

TL; DR;

使用ocamlbuild来推动编译过程。

ocamlbuild -clfags -g file1.native

深入树林

#use是OCaml顶层中的特殊指令,换句话说是OCaml解释器中的指令。该指令是由解释器针对某些效果执行的特殊命令。它们不是语言的一部分。此外,不同的口译员有不同的指示。如果你想编写OCaml程序,那么你需要编译,因为OCaml是一种编译语言。

OCaml带有非常下降的基础设施,这是一个简短的指南。首先,有两个编译器,字节码和本机。字节码很慢(仍然比Python或Ruby快得多),但是可移植。 Native编译为本机机器代码,因此速度非常快。如果您可以访问这两个编译器,则使用后者。可以说,本机编译速度较慢,我想说在现代机器上,差异可以忽略不计。

过多的工具非常庞大,我们有ocaml用于解释器,ocamlc用于字节码编译,ocamlopt用于本机编译,ocamldep用于查找模块之间的依赖关系, ocamldoc用于编译文档,ocamlmktop用于创建自己的解释器,ocamlmklib用于捆绑库,ocamlrun用于运行字节码。我们还ocamlfind在您的系统上查找库。幸运的是,我们还有一个工具来统治它们,一个工具可以找到它们,一个工具可以将它们全部带到黑暗中并将它们绑定

ocamlbuild。该工具是OCaml语言分发的一部分,它知道所有9个小工具的所有内容。所以你真的不需要学习它们才能在OCaml中开始编程。 ocamlbuild将找到所有依赖项,链接库,并为您创建任何所需内容,包括共享库或您自己的解释器。例如,要与core库链接,只需传递-pkg core选项即可。此外,ocamlbuild具有_tags文件,允许您存储参数并在命令行上节省一些空间。因此,总是将-g选项(不是一个坏主意,顺便说一句)传递给编译器的其他方法是将以下内容添加到_tags文件中:

debug : true

因为,你正在添加这个-g选项,我怀疑你对回溯感兴趣。如果这是真的,那么不要忘记通过调用Printexc.record_backtrace或设置环境变量OCAMLRUNPARAM=b来启用回溯记录。

答案 2 :(得分:0)

我遇到了完全相同的问题,但是找到的解决方案是使用 cppo 预处理程序中的 #include 指令。您可以在 OCaml 编译器的 -pp 开关中包含预处理器。