2010-10-03 10 views
17

में अनबाउंड मॉड्यूल मेरी समस्या यह है कि ocamlc और ocamlopt apear apt-get के माध्यम से स्थापित तृतीय पक्ष पुस्तकालयों को खोजने से इनकार करने के लिए। मैंने पहली बार इस समस्या को शुरू करना शुरू किया जब मैंने अपने स्वयं के ओकैमल कार्यक्रमों में तीसरे पक्ष के मॉड्यूल को शामिल करने का प्रयास किया, और इसे ओकैमल संकलन को समझने में व्यक्तिगत रूप से विफल होने के रूप में इसे तुरंत लिखा। जल्द ही - हालांकि - मैंने अपने स्वयं के निर्देशों के तहत अन्य लोगों की परियोजनाओं को संकलित करने की कोशिश करते समय खुद को एक ही समस्या में भाग लिया।ओकैम

यहां सबसे सीधा-आगे उदाहरण है। अन्य सभी ओकम्बुबिल्ड का उपयोग करते हैं, जो चीजों को थोड़ा कम करता है।

कार्यक्रम: http://groups.google.com/group/fa.caml/msg/5aee553df34548e2

संकलन:

$ocamlc -g -dtypes -pp camlp4oof -I +camlp4 dynlink.cma camlp4lib.cma -cc g++ llvm.cma llvm_bitwriter.cma minml.ml -o minml 
File "minml.ml", line 43, characters 0-9: 
Error:Unbound module Llvm 

यहां तक ​​कि जब मैं LLVM फ़ाइलों को obsolute रास्तों साथ ocamlc प्रदान करते हैं तो जैसे ...

$ ocamlc -g -dtypes -pp camlp4oof -I +camlp4 dynlink.cma camlp4lib.cma -cc g++ /usr/lib/ocaml/llvm-2.7/llvm.cma /usr/lib/ocaml/llvm-2.7/llvm_bitwriter.cma minml.ml -o minml 

.. । कोई फायदा नहीं।

मैं क्या गलत कर रहा हूं?

उत्तर

15

आपका आदेश दो बातें कर रही है: यह (minml.cmo में) minml.ml संकलन है, तो minml में जिसके परिणामस्वरूप वस्तु को जोड़ने।

मॉड्यूल को संकलित करने के लिए निर्भरता के इंटरफेस की आवश्यकता होती है। इंटरफेस में टाइपिंग जानकारी होती है जो कि प्रकार चेकर और कोड जेनरेटर दोनों के लिए जरूरी है; इस जानकारी को कार्यान्वयन में दोहराया नहीं गया है (.cma यहां)। तो संकलन चरण के लिए, llvm.cmi उपलब्ध होना चाहिए। कंपाइलर इसमें पथ शामिल है, इसलिए आपको अतिरिक्त -I +llvm-2.7 (जो -I /usr/lib/ocaml/llvm-2.7 के लिए छोटा है) की आवश्यकता है।

लिंकिंग चरण को llvm.cma की आवश्यकता है, जिसमें मॉड्यूल के बाइटकोड कार्यान्वयन शामिल हैं। यहां, आप या तो -I का उपयोग कर सकते हैं या ocamlc को फ़ाइल को कहां से ढूंढने के लिए एक पूर्ण पथ दे सकते हैं।

ocamlc -g -dtypes -I +camlp4 -I +llvm-2.7 -pp camlp4oof -c minml.ml 
ocamlc -g -cc g++ -I +camlp4 -I +llvm-2.7 dynlink.cma camlp4lib.cma llvm.cma llvm_bitwriter.cma minml.cmo -o minml 

या आप एक ही आदेश में दोनों चरणों करना चाहते हैं:

ocamlc -g -dtypes -cc g++ -I +camlp4 -I +llvm-2.7 dynlink.cma camlp4lib.cma llvm.cma llvm_bitwriter.cma -pp camlp4oof minml.ml -o minml 
+0

अहा! इस तरह के पूर्ण जवाब के लिए धन्यवाद। – Eli

+1

क्या आपके पास कोई अन्य सिद्धांत है कि इन अन्य लोगों ने इस झंडे के बिना प्रोग्राम को संकलित करने की अपेक्षा कैसे की है? जॉन हैरोप बिल्कुल कुछ शौकिया नहीं है। मुझे संदेह है कि इस पागलपन के लिए एक विधि है। – Eli

+3

@itsmyown: जॉन के मामले में, वह उस निर्देशिका में उदाहरण को संकलित कर सकता है जहां उसने एलएलवीएम बाइंडिंग को संकलित किया है, या हो सकता है कि उसने उन बाइंडिंग को सीधे उपनिर्देशिका के बजाय ओकैम पुस्तकालय निर्देशिका में स्थापित किया हो। आपके द्वारा उद्धृत कैमल-सूची संदेश के दर्शकों को आवश्यकतानुसार '-I' जोड़ना होगा। वैसे, मुझे यकीन नहीं है कि '-cc g ++' वास्तव में आवश्यक है या नहीं। – Gilles

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