Вы можете подумать, что .cmo
является библиотекой, но это не так.
.cmo
- файл объекта bytecode. Это как .class
в Java.
.cma
является библиотекой байт-кода. Он производит путем архивирования около .cmo
в .cma
.cmx
произведено ocamlopt
(компилятор нативного кода). Основными выходными файлами ocamlopt
является .o
, но ocamlopt
также производит его.
Для создания исполняемых файлов, мы организуем .cmo
и .cma
как ocamlc -o executable lib.cma a.cmo b.cmo ...
, чтобы связать их.
Здесь вы можете написать .ml
вместо .cmo
, но это то же самое, что и компиляция .ml
с -c
и ссылку .cmo
и другие файлы.
Для вашего глубокого допер, это лучше, чтобы проверить, как каждый из файлов (связанные с OCaml) производятся.
Посмотрим, какие файлы производятся по ocamlc
и ocamlopt
.
[/tmp/test] ls
test.ml
[/tmp/test] cat ./test.ml
let id x = x
[/tmp/test] ocamlc -c /tmp/test/test.ml
[/tmp/test] ls
test.cmi test.cmo test.ml
[/tmp/test]
Теперь я составил test.ml
файл и скомпилировать его с ocamlc
с -c
опцией (содержание test.ml
не имеет здесь). Вы видите ocamlc
выводит два файла:
test.cmi
: скомпилированный файл интерфейса. Этот файл включает информацию о типе функций, переменные в test.ml
для отдельной компиляции.
test.cmo
: Файл объекта Bytecode: это как .class
файл на Java.
Мы используем файлы .cmo
для создания исполняемых файлов.
[/tmp/test] ocamlc -c test.ml
[/tmp/test] ocamlc -o a.out test.cmo
[/tmp/test] ls
a.out test.cmi test.cmo test.ml
Вы видите a.out
файл производится с помощью файла .cmo
.
.cma
являются библиотечными файлами. Они создаются путем составления нескольких файлов .cmo
.
[/tmp/test] ls
test.ml lib.ml
[/tmp/test] cat lib.ml
let i = Test.id 1
let j = Test.id 2
[/tmp/test] ocamlc -c test.ml; ocamlc -c lib.ml
[/tmp/test] ls
lib.cmi lib.cmo lib.ml test.cmi test.cmo test.ml
[/tmp/test] ocamlc -a -o testlib.cma ./test.cmo lib.cmo
[/tmp/test] ls
lib.cmi lib.cmo lib.ml test.cmi test.cmo test.ml testlib.cma
Теперь я создаю lib.ml
(которые используют id
функцию в test.ml
) и компилировать test.ml
и lib.ml
, а затем соединить их, чтобы создать testlib.cma
(опция -a
означает создание библиотеки).
Вы можете видеть, что .cma
просто упакован .cmo
файлами.
Чтобы использовать библиотеку, мы просто организуем ее с другими объектными файлами.
[/tmp/test] cat user.ml
let _ = print_int (Lib.i + Lib.j)
[/tmp/test] ocamlc -c user.ml
[/tmp/test] ocamlc -o a.out testlib.cma user.cmo
Наконец, давайте посмотрим, какие файлы производят с помощью ocamlopt
.
[/tmp/test] ocamlopt -c ./test.ml
[/tmp/test] ls
test.cmi test.cmx test.ml test.o
ocamlopt
производит
test.o
: Родной объект файл
test.cmi
: Составитель interaface файл
test.cmx
: Также нативный объектный файл, но он в основном используется для встраивания функций по файлам !! !
Обзор [байт-код] (http://caml.inria.fr/pub/docs/manual-ocaml/comp.html#sec263) и [собственный компилятор] (http: // caml .inria.fr/pub/docs/manual-ocaml/native.html # sec283) в руководстве достаточно хорошо объясняют звезду файлов, связанных с компиляцией OCaml. –