Sie können denken, dass .cmo
Bibliothek ist, aber es ist nicht.
.cmo
ist die Bytecode-Objektdatei. Es ist wie .class
in Java.
.cma
ist Bytecode-Bibliothek. Es ist produzieren durch die Archivierung von einigen .cmo
in .cma
.cmx
wird von ocamlopt
(der native-Code-Compiler) produziert. Hauptausgangsdateien von ocamlopt
sind .o
aber ocamlopt
produzieren auch es.
ausführbare Dateien zu erstellen, wir .cmo
und .cma
wie ocamlc -o executable lib.cma a.cmo b.cmo ...
ordnen sie zu verbinden.
Sie können .ml
hier statt .cmo
schreiben, aber es ist das gleiche wie kompilieren .ml
mit -c
und verknüpfen Sie die .cmo
und andere Dateien.
Für Ihr tiefes Verständnis, ist es besser zu überprüfen, wie jede Dateien (bezogen auf Ocaml) produziert werden.
Mal sehen, welche Dateien von ocamlc
und ocamlopt
erzeugt werden. Jetzt
[/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]
I test.ml
-Datei kompiliert und kompilieren Sie es mit ocamlc
mit -c
Option (der Gehalt an test.ml
ist hier keine Rolle). Sie sehen ocamlc
gibt zwei Dateien:
test.cmi
: Zusammengestellt Interface-Datei. Diese Datei enthält Typinformationen von Funktionen, Variablen in test.ml
zur separaten Kompilierung.
test.cmo
: Bytecode Objektdatei: Es ist wie .class
Datei in Java.
Wir verwenden .cmo
Dateien, um ausführbare Dateien zu erstellen.
[/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
Sie a.out
-Datei werden über die .cmo
Datei erzeugt.
.cma
sind Bibliotheksdateien. Diese werden erzeugt, indem mehrere .cmo
Dateien zusammengesetzt werden.
[/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
Jetzt schaffe ich lib.ml
(die id
Funktion in test.ml
verwenden) und kompilieren test.ml
und lib.ml
, verknüpfen sie dann testlib.cma
(Option -a
Mittel eine Bibliothek erstellen) zu erstellen.
Sie können sehen, .cma
ist nur mit .cmo
Dateien gepackt.
Um die Bibliothek zu verwenden, ordnen wir sie einfach mit anderen Objektdateien an.
[/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
Schließlich wollen wir überprüfen, welche Dateien produzieren sind von ocamlopt
.
[/tmp/test] ocamlopt -c ./test.ml
[/tmp/test] ls
test.cmi test.cmx test.ml test.o
ocamlopt
produziert
test.o
: Gebürtige Objektdatei
test.cmi
: Zusammengestellt interaface Datei
test.cmx
: Auch nativen Objektdatei, aber es ist vor allem für inlining Funktionen für Dateien verwendet !! !
Die Übersicht über [Byte-Code] (http://caml.inria.fr/pub/docs/manual-ocaml/comp.html#sec263) und [nativen Compiler] (http: // caml .inria.fr/pub/docs/manual-ocaml/native.html # sec283) im Handbuch erklärt sehr gut die Menagerie von Dateien im Zusammenhang mit OCaml Compilation. –