2013-04-12 23 views
10

Ocaml programlama ile yeni başlayan bir programcıyım ve bir modülü programıma bağlarken sorun yaşıyorum. Aslında bazı düzenli ifade denetimi yapıyorum ve Str module kullanarak bir ayırıcı dize temel alarak bir dize temelde belirten bir işlev yazdık. Yani ben böyle kütüphanede tanımlı işlevleri kullanabilirsiniz: Ben ml'lik dosyasını derlemeye çalıştığınızdaOcaml içindeki modül bağlanırken hata oluştu

Str.regexp_string /*and so on*/ 

Ancak, bir hata ben tanımlanmamış bir küresel Str sahip olduğunu düşündüren olsun. List.length 'i yazarak List Listesini kullanacağız ve tıpkı spesifik modül içermek zorunda kalmadan Str için yaptığım gibi. Ben var çünkü toplevel I (nihai yürütülebilir almak için 3 cmo bitiş linkte için

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

ben ml'lik dosyasında modülü eklemek istediğiniz kullanmak Ancak

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

çalıştı hangi üst düzeyde çalıştırılmaz). Bunun gerçekten basit bir soru olduğunu biliyorum ama bunu çözmekte zorlanıyorum. Şimdiden teşekkürler.

cevap

11

Dosyanıza bir şey eklemeniz gerekmez foo.ml. foo.ml dosyasını derlerken Str modülünü nerede bulacağınızı derleyicinize bildirmeniz gerekir. Bunu yapmak için, foo.ml derlemek için kullanılan komut satırına ekleyin:

ocamlc str.cma foo.ml 

veya

ocamlopt str.cmxa foo.ml 

List ve standart kütüphaneden diğer modüller

varsayılan olarak erişilebilir, görmemeni Derleyiciye sık kullanılan modüller hakkında bilgi vermesi gerekir.

+0

Çözümünüzün işe yarayacağını düşünmüyorum çünkü sonuçta oluşturulan ".cmo" dosyalarını bağlamak istediğinden bahsediyor. Yani "Str" modülünün bazı işlevlerini kullanan ve söylediğiniz gibi derleyen bir basit derler ve derler. i ".cmo" toplevel yüklemek, ben hala soru başına bir programı bağlama hakkında olduğunu tanımsız küresel Str –

+3

söyleyerek bir hata alıyorum.Üst seviye için cevap biraz farklı. Toplevelde str.cma ''. –

+0

... veya "ocaml" üst seviyesini "ocaml str.cma" ile çağırmak. – nlucaroni

0

'-cclib' derleyici yönergesini kullanmanız gerektiğini düşünüyorum. Modül adı, .cma gibi biten dosyayı içermemelidir. Unix ve thread modülleri kullanmaya çalışırken yaptığım şey aşağıda. Sanırım 'custom' ve 'cclib' derleyici direktiflerinin bazı kombinasyonlarını kullanmanız gerekiyor.

ocamlc -Özel unix.cma threa.ml -cclib -lunix

yardımı için bu kitabın bölüm 7'de bak: http://caml.inria.fr/pub/docs/oreilly-book/html/book-ora063.html

Ve burada derleyici yönergelerinin kapsama bakmak: 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, kepçeyi kesmek için çok basittir.

On ocaml 4.0.2. Açıkçası, burada bir problem var, ama ne olduğunu anlamak için çok yeni bir başlangıç ​​yapıyorum. Üst düzeyden #load "str.cma" ile iyi çalışıyor gibi görünüyor, bu yüzden burada anlamadığımız bir şey var. Ne olduğunu bilen var mı?

+1

'str.cma' öğesini calc.ml'den önce yazmanız gerekir. –

+0

Bu sorunu 'Std' ile nasıl çözeceğinizi biliyor musunuz? Ben burada aynı sorunu yaşıyorum, ama sadece 'Std' ile – Jay