2016-06-10 2 views
2

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

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

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

Благодаря

+1

Обзор [байт-код] (http://caml.inria.fr/pub/docs/manual-ocaml/comp.html#sec263) и [собственный компилятор] (http: // caml .inria.fr/pub/docs/manual-ocaml/native.html # sec283) в руководстве достаточно хорошо объясняют звезду файлов, связанных с компиляцией OCaml. –

ответ

4

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

. Вы отвечаете более полно, чем мой, но если вы говорите о '.cmx', вы также должны упомянуть' .cmxa'. ;-) – Lhooq

1

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

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

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

+0

Ваше объяснение помогает также помнить эти расширения! Спасибо, человек. –