Есть ли причина сохранить .cmo или только .cma? - PullRequest
4 голосов
/ 25 декабря 2011

Скажем, у меня есть mylibrary.ml, который предоставляет обертки для library.c, и я хочу скомпилировать байт-код и предоставить mylibrary.ml в качестве библиотеки для другого кода ocaml. Компиляция в байт-код (и я не рассматриваю компиляцию ocaml для нативного кода здесь) приводит к ряду файлов, и мне интересно, есть ли какая-то причина, чтобы сохранить их все? Или предоставить их всем остальным пользователям библиотеки?

Я (до сих пор) понимаю, что мне нужен объект библиотеки байт-кода mylibrary.cma, чтобы я мог использовать mylibrary на верхнем уровне ocaml как

ocaml mylibrary.cma

или что я могу

#load "mylibrary.cma";;

из сценария ocaml. Затем также скомпилированный интерфейс mylibrary.cmi и dllmylibrary.so (который содержит части кода C) необходимы для работы вышеупомянутого. А файл определения некомпилированного интерфейса mylibrary.mli удобно хранить в целях документации.

Но есть ли причина сохранить файл mylibrary.cmo, если у меня есть файл mylibrary.cma? В каком случае кому-то это тоже нужно?

РЕДАКТИРОВАТЬ: я имею в виду, мне нужно создать .cmo в make-файле, а затем использовать его для создания .cma, но я думал удалить .cmo после этого, чтобы сохранить каталог немного чище.

Ответы [ 2 ]

4 голосов
/ 26 марта 2012

Таким образом, очевидно, что назначение различных файлов (при ограничении этого компилятором байт-кода):

mylibrary.mli - определение интерфейса, читаемое человеком (не обязательно, компилятору нужны только .cmi)
mylibrary.cmi - скомпилированный интерфейс, необходимый при компиляции кода, вызывающего mylibrary
library.o - C объектный файл
dlllibrary.so - объект разделяемой библиотеки из .o
dlllibrary.a - статический объект библиотеки из .o
mylibrary.cmo - объект байт-кода, скомпилированный из mylibrary.ml
mylibrary.cma - библиотека байт-кодов

Затем mylibrary.cmamylibrary.cmi и dlllibrary.so) необходимы при загрузке mylibrary с верхнего уровня:

#load "mylibrary.cma";;

OR

Можно скомпилировать программу с байт-кодом, которая динамически связывается с mylibrary.cma (mylibrary.cmi и dlllibrary.so также необходимы):

ocamlc mylibrary.cma <program>.ml

OR

динамическое связывание с объектом байт-кода вместо библиотеки байт-кода (необходимо: mylibrary.cmo, mylibrary.cmi, dlllibrary.so):

ocamlc dlllibrary.so mylibrary.cmo <program>.ml

(Примечание: затем запустите байт-код с: ocamlrun -I . <program>, предполагая, что dlllibrary.so находится в текущем каталоге.)

OR

статическое связывание с объектами (необходимы файлы: mylibrary.cmo, mylibrary.cmi liblibrary.a)

ocamlc -custom liblibrary.a mylibrary.cmo <program>.ml

OR

статическое связывание с объектами библиотеки (необходимы файлы: mylibrary.cma, mylibrary.cmi, liblibrary.a)

ocamlc -custom -I . mylibrary.cma <program>.ml

Таким образом, в зависимости от того, как в будущем планируется использовать библиотеку, нужны разные файлы. За исключением того, что .mli требуется только для читателей-людей, а объектный файл .o, скомпилированный из библиотеки C, не нужен (но в некоторых случаях потребуется при компиляции в нативный код).

2 голосов
/ 25 декабря 2011

Вы должны даже сохранить исходный код библиотеки.Очень часто при обновлении компилятора Ocaml (например, с 3.12 до версии 3.13) ваши предыдущие файлы *.cmo или *.cma не смогут работать без перекомпиляции.

Если вы всегда можете очистить и перекомпилировать вещи(например, у вас есть две традиционные цели clean и all до make), вы можете оставить только *.cma

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...