OCaml编译#使用错误

OCaml编译#使用错误,ocaml,Ocaml,我试图编译一个带有调试器标志-g的OCaml文件,文件中有以下行--#使用“file2.ml”。为什么只要我有use关键字,文件就不会编译?“#use”关键字的确切用途是什么?是否有替代方案?以#开头的指令仅在顶级OCaml解释器(也称为读取-评估-打印循环)中受支持 在顶层,#use使解释器从文本文件中读取OCaml代码。之后,它继续以交互方式执行命令 对于已编译的代码,您应该单独编译,然后将模块链接在一起。如果file2.ml中的代码没有形成完整的模块,您可能需要将其直接剪切/粘贴到主文件中

我试图编译一个带有调试器标志-g的OCaml文件,文件中有以下行--#使用“file2.ml”。为什么只要我有use关键字,文件就不会编译?“#use”关键字的确切用途是什么?是否有替代方案?

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

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

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

更新

下面是如何以老式的方式编译两个OCaml文件。你会发现有人说这些方法已经过时,你应该学会使用
ocamlbuild
。这也许是正确的,但至少目前我还是老派

$ ocamlc -o program file2.ml file1.ml
您必须按依赖关系顺序列出
.ml
文件,即文件必须在其使用的任何文件之后列出。这已经是使用更强大的构建工具的原因之一

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

TL;博士 用于驱动编译过程

ocamlbuild -clfags -g file1.native
森林深处
#use
是OCaml顶级中的一个特殊指令,换句话说,是OCaml解释器中的一个特殊指令。此指令是由解释器为某些效果执行的特殊命令。它们不是语言的一部分。此外,不同的口译员有不同的指示。如果您想编写一个OCaml程序,那么您需要编译,因为OCaml是一种编译语言

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

过多的工具相当多,我们有
ocaml
用于解释器,
ocamlc
用于字节码编译器,
ocamlopt
用于本机编译,
ocamldep
用于查找模块之间的依赖关系,
ocamldoc
用于编译文档,
ocamlktop
用于制作自己的解释器,
ocamlmklib
绑定库,
ocamlrun
运行字节码。我们还有
ocamlfind
来查找系统上的库。幸运的是,我们也有一个工具来统治他们所有人,一个工具来发现他们,一个工具把他们都带来,在黑暗中束缚他们

下面是
ocamlbuild
。这个工具是OCaml语言发行版的一部分,它了解所有9个次要工具的一切。因此,您不需要学习它们就可以开始使用OCaml编程
ocamlbuild
将查找所有依赖项、链接库,并为您创建任何您想要的内容,包括共享库或您自己的解释器。例如,要链接到
core
库,只需传递
-pkg core
选项。此外,ocamlbuild有
\u标记
文件,允许您存储参数并在命令行上节省一些空间。因此,要始终将
-g
选项(顺便说一句,这是个不错的主意)传递给编译器,另一种方法是将以下内容添加到
\u标记
文件中:

debug : true

既然您添加了这个
-g
选项,我怀疑您对回溯感兴趣。如果这是真的,那么不要忘记通过调用
Printexc.record\u backtrace
或通过设置环境变量
OCAMLRUNPARAM=b
来启用回溯录制

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

您是说file2.ml需要像这样用file1.ml编译吗?我不知道是谁说直接使用
ocamlc
已经过时了,但这些人都是白痴。如果您想成为一名熟练的OCaml程序员,在某个时候了解基本工具链的工作原理以及它们生成的构建工件是必不可少的。我强烈建议您反复阅读本手册的第三部分,若您想成为一名熟练的程序员,最好开始使用OCaml编程。OCaml基础设施对新来者已经相当不友好了,因此,通过将他们指向低级工具来提高门槛,是一种通往小型和垂死的(但可能是精英?)社区的方式。无论如何,我不认为用关于这个问题的辩论来混乱初学者问题的答案是合适的。这是值得讨论的,但不是在回答初学者提出的简单问题上。当然,这是绝对正确的。