2017-05-16 3 views
0

Zuerst verwendet ich die folgende Make-Datei verwenden zu kompilieren (ich weiß nicht, ob es wichtig ist, aber da ich mit ihm zusammenstellen ...):Impossible Funktionen in Ocaml aus einer anderen Datei aller

NAME = project 


ML = project.ml \ 
     main.ml 


MLI = project.mli 


CMI = $(MLI:.mli=.cmi) 
CMO = $(ML:.ml=.cmo) 
CMX = $(ML:.ml=.cmx) 


OCAMLDPE = ocamldep 
CAMLFLAGS = -w Aelz -warn-error A 
OCAMLC = ocamlc $(CAMLFLAGS) 
OCAMLOPT = ocamlopt $(CAMLFLAGS) 
OCAMLDOC = ocamldoc -html -d $(ROOT)/doc 


all:  .depend $(CMI) $(NAME) 

byte:  .depend $(CMI) $(NAME).byte 


$(NAME): $(CMX) 
     @$(OCAMLOPT) -o [email protected] str.cmxa $(CMX) 
     @echo "[OK] $(NAME) linked" 

$(NAME).byte: $(CMO) 
     @$(OCAMLC) -o [email protected] str.cma $(CMO) 
     @echo "[OK] $(NAME).byte linked" 

%.cmx:  %.ml 
     @$(OCAMLOPT) -c $< 
     @echo "[OK] [$<] builded" 

%.cmo:  %.ml 
     @$(OCAMLC) -c $< 
     @echo "[OK] [$<] builded" 

%.cmi:  %.mli 
     @$(OCAMLC) -c $< 
     @echo "[OK] [$<] builded" 

documentation: $(CMI) 
     @$(OCAMLDOC) $(MLI) 
     @echo "[OK] Documentation" 


re:  fclean all 


clean: 
     @/bin/rm -f *.cm* *.o .depend *~ 
     @echo "[OK] clean" 


fclean:  clean 
     @/bin/rm -f $(NAME) $(NAME).byte 
     @echo "[OK] fclean" 


.depend: 
     @/bin/rm -f .depend 
     @$(OCAMLDPE) $(MLI) $(ML) > .depend 
     @echo "[OK] dependencies" 

ich habe 3 Dateien, mein main.ml, ein project.ml und project.mli i eine einfache Funktion haben yolo im main.ml:

let yolo lol = 
    print_string(lol) 
;; 

Aber wenn ich versuche, es zu nennen in meinem project.ml wie folgt aus:

Main.yolo "lol"; 

Ich sage nur, einen Fehler haben, dass das Modul Main nicht gebunden ist:

[OK] [project.mli] builded 
File "project.ml", line 34, characters 1-10: 
Error: Unbound module Main 
make: *** [project.cmx] Erreur 2 

hier auch der Gehalt an project.ml ist (project.mli ist leer):

let rec project l = 
    Main.yolo l; 
;; 

Random.self_init();; 

let _ = project [] ;; 

Während suche auf der stackoverflow die bereits gestellte frage habe ich tonnen von menschen mit dem gleichen problem gefunden .... weil sie #use verwendet haben, aber es ist nicht mein Fall.

Als Anfänger, wenn Sie mir erklären könnten, wäre es genial :).

+0

Es wäre hilfreich, den Inhalt von 'main.ml',' project.ml', 'project.mli' und die genaue Fehlermeldung zu haben. Auch wann passiert diese Fehlermeldung? Wann wird ein Modul gebaut oder während der Verbindungsphase? –

+0

@ ÉtienneMillon hinzugefügt :) es gibt nichts Unglaubliches, hoffe es kann trotzdem helfen ^^ – xoxel

Antwort

6

In Ihrem Makefile sollte die ML Liste der Module in einer topologischen Reihenfolge sortiert sein, d. H. Ein Modul sollte nach all seinen Abhängigkeiten angegeben werden. In Ihrem Fall der Kopfzeile Ihres Makefile sollte wie folgt aussehen:

NAME = project 

ML = main.ml \ 
     project.ml 

Last but not least, empfehle ich Ihnen nicht Makefiles zu verwenden OCaml Programme zu kompilieren, wenn Sie wirklich wissen, was Sie tun und wie Low- Level OCaml Toolchain funktioniert. Verwenden Sie ocamlbuild für kleine Projekte und oasis für die große. In Ihrem Fall müssen Sie nicht etwas Bestimmtes Ihr Projekt zu bauen, tun nur

ocamlbuild project.native 

Und Sie werden das binäre bekommen. Es wird auch Ihr Arbeitsverzeichnis sauber halten (und wenn es bereits schmutzig ist, wird es Ihnen helfen, es zu bereinigen).

2

Sie haben Code, um die Abhängigkeiten zu berechnen, aber Sie enthalten sie nicht. So wird Project gebaut, wenn Main noch nicht gebaut ist.

Hinzufügen die folgende Zeile am Ende Ihres Makefile Fixes es:

-include .depend 

aber sagen, dass ich gegen die Verwendung von make raten würde und ein Build-Tool wie ocamlbuild verwenden. Ohne Setup können Sie ocamlbuild project.byte ausführen und entsprechende Funktionalität haben.

+1

Dies wird nur den Fehler auf die Linking-Phase verschieben.Sie müssen die Module weiterhin in der topologischen Reihenfolge angeben, da die Verknüpfungsregel explizit von der CMO-Liste abhängt, die aus der ML-Liste erstellt wird. – ivg

Verwandte Themen