2011-12-29 13 views
12

मेरे पास एक फ़ाइल Tools.ml है जिसमें कुछ सामान्य उपयोगिता कार्य शामिल हैं जो मैं स्वयं लिखता हूं। .../Code/ के तहत मेरे पास कई फ़ोल्डर्स हैं जिनमें प्रत्येक में एक प्रोजेक्ट होता है। मेरा सवाल यह है कि मुझे यह Tools.ml रखना चाहिए ताकि .../Code/ के तहत सभी फ़ोल्डर्स और फ़ाइलें Open Tools द्वारा इस मॉड्यूल को साझा कर सकें।ओकैम में साझा उपयोगिता मॉड्यूल कहां रखा जाए?

आशा है कि मेरा प्रश्न स्पष्ट है ... क्या किसी के पास कोई अच्छा समाधान है?

Edit1: @ gasche के जवाब के बाद, मैं tools.ml लिखा है इस प्रकार है:

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

तो मैं यह संकलित, और ocamlfind install tools META tools.cmo tools.cmx tools.ml किया सुझाव के रूप में है, जो अच्छी तरह से जा रहा लगता है। तब मैं test.ml लिखा इस प्रकार है:

open Tools 

let f = Tools.a_function 

तो मैं ocamlc test.ml -o test के साथ संकलित, तो मैं एक त्रुटि मिली:

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

किसी को भी मुझे बता सकते हैं क्या हुआ?

उत्तर

13

आप इसे एक पुस्तकालय के रूप में अपने प्रोजेक्ट से अन्य ओकैम पुस्तकालयों के साथ स्थापित कर सकते हैं, और इसे एक्सेस कर सकते हैं।

ऐसा करने का एक बहुत ही आसान तरीका ocamlfind के लिए एक मेटा फ़ाइल लिखना है। कहीं भी एक निर्देशिका बनाएं जहां आप "व्यक्तिगत लाइब्रेरी" प्रोजेक्ट को पकड़ने में सहज महसूस करें। मान लें कि आपके पास tools.ml और tools.mli है, और आपका कोड कुछ findlib पैकेज (उदाहरण के लिए unix और bigarray) पर निर्भर करता है। आप मेटा इस प्रकार दिखाई देगा:

name="tools" 
description="personal collection of utilities" 
version="0.1" 
requires="unix,bigarray" 
archive(byte)="tools.cmo" 
archive(native)="tools.cmx" 

बार जब आप इस मेटा फ़ाइल में लिखा है, यह "स्थापित करने के लिए" पुस्तकालय ocamlfind पूछने के लिए आसान है (और इसे हटाने यदि आप चाहते हैं), और अपने अन्य में उपयोग परियोजनाओं। स्थापित करने के लिए, वाक्यविन्यास ocamlfind install <name> <meta-file> <file1> <file2> ... है जहां <file1>, <file2>.. वह फ़ाइल है जिसे आप स्थापना निर्देशिका में शामिल करना चाहते हैं। मूल संकलन के लिए आपको कम से कम tools.cmitools.cmo (और tools.o और tools.cmx) होना चाहिए, लेकिन उदाहरण के लिए tools.mli भी होना अच्छा है (और, यदि आप कोड प्रदान करना चाहते हैं, tools.ml)।

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

(पाठ्यक्रम tools.cmo आदि के अस्तित्व के लिए है, कि तुम चाहिए install के बाद आप अपने पैकेज तैयार की है है। आप ocamlbuild का इस्तेमाल किया है, तो वे एक _build उपनिर्देशिका में होने की संभावना है, इसलिए ocamlfind install ... _build/tools.cmo ...।)

अपने कई परियोजनाओं से, आप सीधे अगर यह क्या आप पहले से ही अपने कार्यक्रम संकलन करने के लिए क्या है आसानी से अपने पुस्तकालय का उपयोग कर सकते हैं, या तो ocamlfind toold का उपयोग कर

ocamlfind ocamlc -package tools .... 

या उदाहरण के लिए ocamlbuild द्वारा प्रदान की गई सुविधाओं के माध्यम से, अपने टैग में package(tools) जोड़ना।

यदि आप इसे करने के लिए एक परिवर्तन किया अपने पुस्तकालय को पुनर्स्थापित और यह अपनी परियोजनाओं से सुलभ

ocamlfind remove tools 
ocamlfind install tools META ... 

तुम भी oasis के माध्यम से यह सब संभाल सकता है, जो ocamlfind/ocamlbuild को स्वचालित करने के शीर्ष पर एक परत है चाहता हूँ करने के लिए यह प्रोसेस। मैं अपने सिर के शीर्ष से ऐसे उदाहरण देने के लिए oasis के साथ पर्याप्त परिचित नहीं हूं, लेकिन यह इस तरह के एक प्रतिबंधित मामले (एक फ़ाइल लाइब्रेरी) के लिए समान रूप से सरल होना चाहिए, और यदि आप बाद में अपनी लाइब्रेरी का विस्तार करना चाहते हैं तो बेहतर स्केल करना चाहिए (उदाहरण के लिए यह दस्तावेज उत्पादन, पूर्व संकलन विन्यास भी संभाल सकता है ...)।

+0

आपकी टिप्पणी के लिए धन्यवाद ... क्या आप ओपी में अपना परीक्षण देख सकते हैं? – SoftTimur

+1

@ सॉफ़्ट टिमूर: आपके मामले में सही संकलन कमांड 'ocamlfind ocamlc -package tools -linkpkg test.ml -o test' है। विकल्प '-पैकेज टूल्स' पैकेज को जोड़ता है, और '-linkpkg' इसे निष्पादन योग्य बनाने के लिए लिंक करता है (जब आप निष्पादन योग्य उत्पन्न करते हैं, लेकिन '.cmo'' को संकलित करते समय आवश्यक नहीं है)। आप शायद 'ocamlbuild -tag "पैकेज (उपकरण)" test.byte' का भी उपयोग कर सकते हैं (परीक्षण नहीं किया गया)। – gasche

+0

@gashe: 'ocamlfind ocamlc -package tools -linkpkg test.ml -o test' केवल तभी काम करता है जब 'test.ml' निष्पादन योग्य' टूल' के समान फ़ोल्डर में होता है ... क्या आप जानते हैं क्यों? – SoftTimur

संबंधित मुद्दे