2016-06-10 7 views
2

Ich bin neu in der OCaml und ich bin verwirrt mit der Datei von .cma, .cmo und .cmx. Manchmal muss ich eine .cma-Datei in den Kompilierbefehl aufnehmen, aber manchmal muss ich eine .cmo-Datei hinzufügen.Unterschied zwischen .cma, .cmo, .cmx Dateien und wie man sie beim Kompilieren richtig benutzt?

Warum gibt es einen solchen Unterschied für die Bibliothek? Ist es das gleiche Konzept in C++ wie Bibliothek und Pfad?

Beispiel: ocamlc -o ausführbare str.cma extstring.cmo mycode.ml

Dank

+1

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. –

Antwort

4

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 !! !
+0

Sie antworten ist viel vollständiger als meins, aber wenn Sie über '.cmx sprechen, sollten Sie' .cmxa auch erwähnen. ;-) – Lhooq

1

So ist der Unterschied hier ist, (wenn es eine x in der Dateierweiterung ist, bedeutet dies, es ist ein mutter ist Code kompiliert Objekt, so dass es schneller läuft die cmx Dateien mit ocamlopt und die cmo Dateien mit ocamlc erhalten werden.):

  • .cma/.210 -> Bibliotheken, die für den Programmierer bereits verfügbar sind (Standardbibliotheken und Bibliotheken, die Sie installiert)
  • .cmo/.cmx -> Objektdateien auf Ihre .ml Dateien entsprechenden

TL; DR: .cm(x)a Dateien waren nicht von dir erstellt, .cm(o|x) Dateien waren.

+0

Ihre Erklärung hilft, sich auch an diese Erweiterungen zu erinnern! Danke Mann –