2011-12-29 8 views
12

Kendime yazdığım bazı genel yardımcı işlevler içeren bir dosyam var Tools.ml. .../Code/'un altında, her birinde bir proje bulunan birkaç klasör var. Benim soru bu Tools.ml yerleştirmeliyim nerede .../Code/ altındaki tüm klasörler ve dosyalar bu modülü Open Tools tarafından paylaşabilirsiniz.Paylaşılan bir yardımcı program modülü OCaml'ye nereye yerleştirilir?

Sorunun açık olduğunu umuyorum ... İyi bir çözümü olan var mı?

Edit1 şöyledir: @ Gasche cevabı takiben, ben tools.ml yazdım:

module Tools = 
    struct 
    let a_function = ... 
    ... 
    end 

Sonra onu derlenmiş ve iyi gidiyor görünüyor ki, önerildiği gibi ocamlfind install tools META tools.cmo tools.cmx tools.ml yapılır.

File "test.ml", line 1, characters 0-1: 
Error: Error while linking test.cmo: 
Reference to undefined global `Tools' 

kimse ne olduğunu söyler misiniz:

open Tools 

let f = Tools.a_function 

sonra ben sonra bir hata var, ocamlc test.ml -o test ile derlenmiş şu şekildedir: Sonra test.ml yazdım?

cevap

13

Bunu bağımsız bir kitaplık olarak paketleyebilir, diğer OCaml kitaplıklarıyla birlikte yükleyebilir ve projenizden bir kitaplık olarak buna erişebilirsiniz.

Bunu yapmanın çok basit bir yolu ocamlfind için bir META dosyası yazmaktır. Size "kişisel kütüphane" projesi tutmak için rahat bir yerde bir dizin oluşturun. tools.ml ve tools.mli olduğunu ve kodunuzun bazı findlib paketlerine (örneğin, unix ve bigarray) bağlı olduğunu varsayalım.

bu META dosyayı yazdıktan sonra
name="tools" 
description="personal collection of utilities" 
version="0.1" 
requires="unix,bigarray" 
archive(byte)="tools.cmo" 
archive(native)="tools.cmx" 

, "install" kütüphane için ocamlfind sormak kolaydır (ve isterseniz kaldırmak) ve diğer kullanmak: Sen META şu şekilde görünecektir projeler. Yüklemek için sözdizimi ocamlfind install <name> <meta-file> <file1> <file2> ..., burada <file1>, <file2>.. yükleme dizininde görmek istediğiniz dosyadır. En azından tools.cmitools.cmo (ve yerel derleme için ve tools.cmx) olmalıdır, ancak örneğin tools.mli olması iyi bir uygulamadır (ve, kodu sağlamak istiyorsanız, tools.ml).

ocamlfind install tools META tools.cmi tools.cmo tools.o tools.cmx tools.mli 

(size paketi derledik sonra vb Tabii tools.cmo Of var olması gereken, o size install zorunluluktur. Eğer ocamlbuild kullandıysanız, bu kadar ocamlfind install ... _build/tools.cmo ..., bir _build alt dizininde olması muhtemeldir.)

Bu zaten programlarını derlemek için ne olduğunu doğrudan eğer sayısız projelerden

, sen ocamlfind toold kullanarak ya kolayca kütüphane kullanabilirsiniz

ocamlfind ocamlc -package tools .... 

veya ocamlbuild tarafından sağlanan imkanlar aracılığıyla, etiketlerinize package(tools) ekleyerek.Eğer buna bir değişiklik yapılmaması durumunda

Kütüphanenizi yeniden kurmak ve onu da ocamlfind/ocamlbuild otomatik hale getirmek üstüne bir katman olan oasis üzerinden tüm bu ele verebilir

ocamlfind remove tools 
ocamlfind install tools META ... 

projeleriniz erişilebilir istiyorum bu süreç. Kafamın tepesinden bu tür örnekler vermek için oasis ile yeterince tanıdık değilim, ancak bu tür bir kısıtlanmış durumda (tek dosya kitaplığı) için eşit derecede basit olmalı ve daha sonra kitaplığınızı genişletmek isterseniz daha iyi ölçeklenmelidir (örn. Ayrıca dokümantasyon oluşturma, ön derleme yapılandırması ...) ile de ilgilenebilir.

+0

Yorumunuz için teşekkürler ... OP'deki testime bir göz atabilir misiniz? – SoftTimur

+1

@SoftTimur: Davanızdaki doğru derleme komutu ocamlfind ocamlc -package tools -linkpkg test.ml -o testidir. '-package tools' seçeneği paketi ekler ve '-linkpkg 'bir yürütülebilir dosyayı (bir yürütülebilir dosyayı oluşturduğunuzda, ancak .cmo'ya derlerken değil) üretmek için onu bağlar. Muhtemelen 'ocamlbuild -tag 'paketini de (araçlar) test.byte (test edilmemiştir) kullanabilirsiniz. – gasche

+0

@gashe: 'ocamlfind ocamlc -package tools -linkpkg test.ml -o testi' sadece 'test.ml' yürütülebilir klasörle aynı klasördeyken çalışır ... Biliyor musunuz? – SoftTimur