2013-04-12 18 views
10

Ich bin ein Anfänger mit Ocaml Programmierung und ich habe Probleme beim Verknüpfen eines Moduls in meinem Programm. Tatsächlich mache ich eine Überprüfung des regelmäßigen Ausdruckes und ich habe eine Funktion geschrieben, die im Grunde eine Zeichenkette basierend auf einer Trennzeichenfolge unter Verwendung der Str module tokenisiert. So verwende ich die definierten Funktionen in der Bibliothek wie folgt aus:Fehler beim Verknüpfen des Moduls in ocaml

Str.regexp_string /*and so on*/ 

Allerdings, wenn ich versuchen, die ml-Datei zu kompilieren, erhalte ich einen Fehler darauf hindeutet, dass ich eine nicht definierte globale Str. Wir verwenden Liste Funktionen durch Eingabe in List.length und so weiter, wie ich für Str getan habe, ohne explizit das spezifische Modul einzuschließen. Ich habe versucht,

open Str;; 
include Str;; /*None of these work and I still get the same error*/ 

jedoch, wenn in der Toplevel verwende ich

load "str.cma" /*Then the program works without problems*/ 

Ich mag das Modul in der ml-Datei aufgenommen werden, weil ich in dem Endglied 3 CMO müssen, um die endgültige ausführbare Datei zu erhalten (die wird nicht im Toplevel ausgeführt). Ich weiß, dass dies eine wirklich grundlegende Frage ist, aber ich habe Probleme, sie zu lösen. Danke im Voraus.

Antwort

11

Sie müssen nichts in Ihrer Datei foo.ml hinzufügen. Sie müssen dem Compiler mitteilen, wo das Str-Modul beim Kompilieren von foo.ml zu finden ist. Um dies zu tun, fügen Sie ihn in die Befehlszeile verwendet, um zu kompilieren foo.ml:

ocamlc str.cma foo.ml 

oder

ocamlopt str.cmxa foo.ml 

List und anderen Modulen aus der Standardbibliothek sind mit dem Standard, so dass Sie nicht müssen den Compiler über diese oft verwendeten Module informieren.

+0

Ich glaube nicht, dass Ihre Lösung funktionieren würde, weil er erwähnt, dass er die ".CMO" -Dateien verknüpfen will, die letztendlich generiert werden. Also, wenn ich versuche, ein einfaches zu kompilieren, das einige Funktionen des "Str" -Moduls verwendet, und kompiliere es wie du gesagt hast. Wenn ich die ".cmo" in der Toplevel lade, bekomme ich immer noch einen Fehler undefined global Str –

+3

Die Frage bezieht sich auf die Verknüpfung eines eigenständigen Programms.Die Antwort für Toplevel ist etwas anders. In Toplevel können Sie Str laden, indem Sie '#load 'str.cma" 'sagen. –

+0

... oder den 'ocaml' Toplevel mit' ocaml str.cma' aufrufen. – nlucaroni

0

Ich denke, Sie müssen '-cclib' Compiler-Direktive verwenden. Der Modulname sollte nicht die Dateiendung wie .cma enthalten. Unten ist, was ich getan habe, als ich versuchte, die Unix- und Thread-Module zu verwenden. Ich denke, Sie müssen eine Kombination der "custom" und "cclib" Compiler-Direktiven verwenden.

ocamlc -custom unix.cma threa.ml -cclib -lunix

Blick auf Kapitel 7 dieses Buches für die Hilfe: http://caml.inria.fr/pub/docs/oreilly-book/html/book-ora063.html

Und hier bei Berichterstattung über Compiler-Direktiven aussehen: http://caml.inria.fr/pub/docs/manual-ocaml-4.00/manual022.html#c:camlc

0
ocamlc calc.ml str.cma -o calc 
File "calc.ml", line 1: 
Error: Error while linking calc.cmo: 
Reference to undefined global `Str' 

Der Code ist sehr einfach, um den Lärm zu reduzieren.

let split_into_words s = 
    Str.split (Str.regexp "[ \n\t]+") s ;; 

let _ = 
    split_into_words "abc def ghi" ;; 

Am Okam 4.0.2. Offensichtlich gibt es hier ein Problem, aber ich bin zu viel Anfänger, um zu verstehen, was es ist. Von Toplevel scheint es mit #load "str.cma" gut zu funktionieren, also gibt es hier etwas, was wir nicht verstehen. Wer weiß, was es ist?

+1

Sie müssen 'str.cma' vor' calc.ml' setzen. –

+0

Wissen Sie, wie Sie dieses Problem mit 'Std 'lösen können? Ich habe das gleiche Problem hier, aber nur mit 'Std' – Jay

Verwandte Themen