2013-04-12 9 views
10

Jestem kompletnie początkującym programistą Ocaml i mam problemy z połączeniem modułu z moim programem. Właściwie robię pewne regularne sprawdzanie wyrażeń i napisałem funkcję, która zasadniczo tokenizuje ciąg na podstawie ciągu separatora, używając Str module. Więc mogę używać funkcji zdefiniowanych w bibliotece tak:Moduł łączenia błędów w ocaml

Str.regexp_string /*and so on*/ 

Jednak gdy próbuję skompilować plik ml, otrzymuję błąd sugerując, że mam niezdefiniowanej globalnego Str. Używamy funkcji List poprzez wpisanie w List.length i tak samo jak robiłem dla Str bez konieczności jawnego dołączania konkretnego modułu. Próbowałem

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

Jednak jeśli w Toplevel używam

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

Chcę to moduł w pliku ml bo mam w linku koniec 3 CMO, aby uzyskać ostateczną wykonywalnego (który nie jest uruchamiany na ekranie). Wiem, że to naprawdę podstawowe pytanie, ale mam problem z jego rozwiązaniem. Z góry dziękuję.

Odpowiedz

11

Nie musisz niczego dodawać do pliku foo.ml. Musisz powiedzieć kompilatorowi, gdzie znaleźć moduł Str podczas kompilacji pliku foo.ml. Aby to zrobić, należy dodać go do linii poleceń używane do kompilowania foo.ml:

ocamlc str.cma foo.ml 

lub

ocamlopt str.cmxa foo.ml 

List i inne moduły z biblioteki standardowej są dostępne domyślnie, więc nie trzeba powiedzieć kompilatorowi o tych często używanych modułach.

+0

Nie sądzę, aby twoje rozwiązanie działało, ponieważ wspomniał, że chce połączyć wygenerowane pliki ".cmo". Więc jeśli spróbuję skompilować prostą, która korzysta z niektórych funkcji modułu "Str" i skompilować go tak, jak powiedziałeś. Jeśli załaduję plik ".cmo", nadal pojawia się błąd informujący o niezdefiniowanym globalnym Str –

+3

Pytanie dotyczy łączenia niezależnego programu.Odpowiedź na toplevel jest nieco inna. W większości możesz załadować Str, wypowiadając '#load" str.cma "'. –

+0

... lub wywołanie 'ocaml' toplevel z' ocaml str.cma'. – nlucaroni

0

Myślę, że należy użyć dyrektywy kompilującej "-cclib". Nazwa modułu nie powinna zawierać pliku kończącego się jak .cma. Oto co zrobiłem, próbując użyć modułów unix i wątków. Myślę, że potrzebujesz użyć kombinacji dyrektyw "custom" i "cclib" kompilatora.

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

Look w rozdziale 7 niniejszej książce o pomoc: http://caml.inria.fr/pub/docs/oreilly-book/html/book-ora063.html

I patrzeć na pokrycie dyrektyw kompilatora tutaj: 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' 

Kod jest bardzo prosty, aby ograniczyć pofalowanie.

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

let _ = 
    split_into_words "abc def ghi" ;; 

Na ocaml 4.0.2. Oczywiście, jest tu problem, ale jestem zbyt początkującym, aby zrozumieć, co to jest. Z tweenvel wydaje się działać dobrze z #load "str.cma", więc jest tutaj coś, czego nie rozumiemy. Ktokolwiek wie co to jest?

+1

Musisz wstawić 'str.cma' przed' calc.ml'. –

+0

Czy wiesz, jak rozwiązać ten problem z 'Std'? Mam tutaj ten sam problem, ale tylko z 'Std' – Jay