I am new to Ocaml and trying to write some small example application. I am using ocamlc
version 3.11.2 under Linux Ubuntu 10.04. I want to compile two files:
a.ml
b.ml
File b.ml
uses definitions from a.ml
. As far as I understand, I can use ocamlc -c
to perform compilation only. I can call ocamlc
one final time when I have all the .cmo
files to link them to an executable. Also, when compiling a file that uses definitions from another file, I have to tell the compiler in which .cmi
file to find the external definitions.
So my idea was to use:
ocamlc -i -c a.ml > a.mli
ocamlc -c a.mli b.ml
ocamlc -o b a.cmo b.cmo
The first step works and produces files a.mli
and a.cmo
, but when running the second step I get
File "b.ml", line 1, characters 28-31:
Error: Unbound value foo
where foo
is a function that is defined in a.ml
and called in b.ml
.
So my question is: how can I compile each source file separately and specify the interfaces to be imported on the command line? I have been looking in the documentation and as far as I can understand I have to specify the .mli
files to be included, but I do not know how.
EDIT
Here some more details. File a.ml
contains the definition
let foo = 5;;
File b.ml
contains the expression
print_string (string_of_int foo) ^ "\n";;
The real example is bigger but with these files I already have the error I reported above.
EDIT 2
I have edited file b.ml
and replaced foo
with A.foo
and this works (foo is visible in b.ml
even though I have another compilation error which is not important for this question). I guess it is cleaner to write my own .mli
files explicitly, as suggested by