डी

2012-06-20 11 views
6

में मॉड्यूल आयात करना मैं डी (भाषा रिलीज 2) में आयात करने वाले मूल मॉड्यूल का उपयोग करने की कोशिश कर रहा हूं। एक गाइड के रूप में मैंने dlang.org पर उदाहरण का उपयोग किया लेकिन मेरा सरल कार्यक्रम संकलित नहीं होगा। फाइलें एक ही निर्देशिका में हैं। यहाँडी

import std.stdio; 
import mymodule; 

void main(string[] args){ 
    sayHello(); 
    writeln("Executing Main"); 
} 

और मेरे मॉड्यूल फ़ाइल की सामग्री (mymodule.d) है:

यहाँ मेरी main.d फ़ाइल की सामग्री है

:

void sayHello(){ 
    writeln("hello"); 

} 

संकलन करने के लिए मैं पार्टी के माध्यम से निष्पादित

dmd main.d 

और त्रुटि आउटपुट है:

main.o: In function `_Dmain': 
main.d:(.text._Dmain+0x5): undefined reference to `_D8mymodule8sayHelloFZv' 
collect2: ld returned 1 exit status 
--- errorlevel 1 
+4

'dmd mymodule.d main.d' –

+0

आज़माएं। इसे उचित उत्तर के रूप में पोस्ट करें ताकि मैं आपको मान्यता दे सकूं। तुम इसके लायक हो! भले ही आपको अंक की परवाह नहीं है, कम से कम इस तरह से मैं प्रश्न के उत्तर के रूप में चिह्नित कर सकता हूं। – RedMage

+1

बस rdmd --build-only main.d का उपयोग करें। – Trass3r

उत्तर

9
  1. आपको कमांड लाइन पर संकलित सभी मॉड्यूल सूचीबद्ध करने की आवश्यकता है। यदि आप मॉड्यूल सूचीबद्ध नहीं करते हैं, तो इसे संकलित नहीं किया जाएगा। मॉड्यूल संकलित हैं, संकलित मॉड्यूल का उपयोग करने में सक्षम होंगे, क्योंकि संकलक उनकी घोषणाओं में खींचता है, लेकिन संकलक उनके लिए कोई ऑब्जेक्ट फाइल नहीं उत्पन्न करता है। इसलिए, जब लिंकर लिंक करने के लिए जाता है, तो यह शिकायत करेगा कि परिभाषाएं गायब हैं। इस मामले में, यह इस तथ्य के बारे में शिकायत करता है कि mymodule.sayHello परिभाषित नहीं किया गया है।

    यदि आप चाहते हैं कि संकलक स्वचालित रूप से सभी मॉड्यूल के लिए खोज करे जो पहले मॉड्यूल आयात करता है और उन्हें आपके लिए संकलित करता है, तो आपको rdmd का उपयोग करने की आवश्यकता होगी, जो डीएमडी के लिए एक रैपर है, जो इसके साथ आता है डीएमडी। डीएमडी खुद ऐसा नहीं करता है। यह केवल उन मॉड्यूल को संकलित करता है जिन्हें आप इसे बताते हैं।

  2. आपने Mymodule में std.stdio आयात नहीं किया है। इसलिए, यदि आप dmd main.d mymodule.d करते हैं तो आपको (या इससे भी बेहतर, dmd -w main.d mymodule.d या dmd -wi main.d mymodule.d) होना चाहिए, यह mymodule संकलित करने में विफल रहेगा, क्योंकि writeln घोषित नहीं किया गया है। तथ्य यह है कि main.d आयातित इसका Mymodule पर कोई प्रभाव नहीं पड़ता है।

  3. हालांकि इस मामले में यह कोई बड़ा सौदा नहीं है, आपको वास्तव में अपने मॉड्यूल के शीर्ष पर module modulename; घोषणा करना चाहिए। कंपाइलर फ़ाइल नाम से मॉड्यूल नाम का अनुमान लगाएगा, लेकिन एक बार आपके पास उप-पैकेज होने के बाद, इसे करने के लिए की आवश्यकता है, या आप समस्याएं आयात कर रहे हैं, क्योंकि केवल फ़ाइल नाम अनुमानित है, पैकेज नाम नहीं। इसलिए, यदि आपके पास foo/bar/mod.d है, और आपके पास mod.d में घोषणा नहीं है, तो इसे mod, foo.bar.mod पर अनुमानित नहीं किया जाएगा।

4

dmd mymodule.d main.d

केवल भाषाओं मुझे पता है कि बहुत चालाक अपने दम पर निर्भरता बाहर काम करने हैं

जाओ और हास्केल हैं।

+2

'rdmd' निर्भरताओं को पूरा करेगा। 'rdmd main.d' फ़ाइल और सभी निर्भरताओं का निर्माण करेगा और परिणाम निष्पादित करेगा। यदि आप केवल आदेश में '--build-only' जोड़ना चाहते हैं। – eco

+0

मुझे उस विशेषता को हास्केल में पसंद है। मेरी इच्छा है कि डी भी था। – Arlen

+2

पैडेंटिक होने के लिए, मुझे नहीं लगता कि या तो गो या हास्केल में यह सुविधा है लेकिन उनके कंपाइलर करते हैं। एक अनुरूप डी संकलक भी यह हो सकता है। – BCS