Разница между файлами .cma, .cmo, .cmx и как правильно их использовать при компиляции?

Я новичок в OCaml, и я запутался с файлом .CMA, .CMO а также .CMX. Иногда мне нужно включить файл .cma в команду компиляции, но иногда мне нужно включить файл .cmo.

Почему такая разница для библиотеки? Это та же концепция в C ++, что и библиотека и путь включения?

Пример: ocamlc -o исполняемый файл str.cma extstring.cmo mycode.ml

Спасибо

3

Решение

Вы можете думать, что .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: Тоже собственный объектный файл, но он в основном используется для встраивания функций в файлы !!!
5

Другие решения

Итак, разница здесь (когда есть x в расширении файла это означает, что это скомпилированный объект с собственным кодом, чтобы он работал быстрее. cmx файлы получены с ocamlopt и cmo файлы с ocamlc):

  • .cma / .cmxa -> библиотеки, которые уже доступны для программиста (стандартные библиотеки и библиотеки, которые вы установили)
  • .cmo / .cmx -> объектные файлы, соответствующие вашим .ml файлам

TL; DR : .cm(x)a файлы не были созданы вами, .cm(o|x) файлы были.

1

По вопросам рекламы [email protected]