Я новичок в OCaml, и я запутался с файлом .CMA, .CMO а также .CMX. Иногда мне нужно включить файл .cma в команду компиляции, но иногда мне нужно включить файл .cmo.
Почему такая разница для библиотеки? Это та же концепция в C ++, что и библиотека и путь включения?
Пример: ocamlc -o исполняемый файл str.cma extstring.cmo mycode.ml
Спасибо
Вы можете думать, что .cmo
это библиотека, но это не так.
.cmo
это файл объекта байт-кода. Это как .class
на Яве..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
: Объектный файл байт-кода: это как .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
: Скомпилированный интерфейсный файлtest.cmx
: Тоже собственный объектный файл, но он в основном используется для встраивания функций в файлы !!!Итак, разница здесь (когда есть x
в расширении файла это означает, что это скомпилированный объект с собственным кодом, чтобы он работал быстрее. cmx
файлы получены с ocamlopt
и cmo
файлы с ocamlc
):
.cma
/ .cmxa
-> библиотеки, которые уже доступны для программиста (стандартные библиотеки и библиотеки, которые вы установили).cmo
/ .cmx
-> объектные файлы, соответствующие вашим .ml файламTL; DR : .cm(x)a
файлы не были созданы вами, .cm(o|x)
файлы были.