2012-03-18 23 views
6

से साझा साझा पुस्तकालयों में लिखने वाले लिप्यंतरण को कॉल करना मैं डी में गतिशील साझा पुस्तकालयों के साथ त्वरित रूप से प्रारंभ करने की कोशिश कर रहा हूं, लेकिन मुझे कोई समस्या है।डी 2: डी साइड

मैं dmd -shared ./testlib.d साथ निम्नलिखित कोड का निर्माण कर रहा हूँ:

module testlib; 

import std.c.stdio; 

extern (C) export int hello(int a) { 
    printf("Number is %d", a); 

    return (a + 1); 
} 

यह ठीक बनाता है, और काम करता है। लेकिन जब मैं निम्नलिखित अधिक डी 'ish स्रोत का उपयोग करने के कोशिश कर रहा हूँ: एक बार मैं hello कॉल करने के लिए कोशिश कर रहा हूँ

module testlib; 

import std.stdio; 

extern (C) export int hello(int a) { 
    writefln("Number is %d", a); 

    return (a + 1); 
} 

यह विभाजन गलती के साथ विफल रहता है। मैं क्या गलत कर रहा हूं?

मैं अजगर का उपयोग कर hello फोन कर रहा हूँ:

import ctypes 

testlib = ctypes.CDLL('testlib.dylib'); 

print (testlib.hello(10)) 

UPD1: लगता है कि मैं भी std.conv.to!(string) तरह फोबोस कार्यों का उपयोग नहीं कर सकते।

UPD2: विंडोज़ पर ऐसी कोई समस्या नहीं है, सब ठीक काम करने लगता है। मैक ओएस एक्स इससे पीड़ित है।

UPD3: संभवतः, यह जीसी से जुड़ा हुआ है। मुझे किसी भी तरह जीसी शुरू करना होगा, लेकिन core.memory.GC.enable() अभी भी सेगमेंटेशन गलती के साथ विफल रहता है।

उत्तर

5

समाधान सरल, अभी तक शानदार है:

static import core.runtime; 

extern (C) export void init() { // to be called once after loading shared lib 
    core.runtime.Runtime.initialize(); 
} 

extern (C) export void done() { // to be called before unloading shared lib 
    core.runtime.Runtime.terminate(); 
} 

संभवतः, वहाँ लिनक्स और मैक ओएस एक्स में तरीकों इन कार्यों स्वतः कॉल करने के लिए कर रहे हैं, लेकिन मैं भी इस से संतुष्ट हूँ।

+1

शायद, इसके बजाय RAII का उपयोग करें? इसलिए, नई कक्षा 'ड्रंटटाइम' बनाएं और अपने 'init' फ़ंक्शन को कन्स्ट्रक्टर,' किया '- विनाशक को जोड़ें। तो, ग्राहक सिर्फ इस वर्ग का उद्देश्य बनाते हैं - और यह हमारे लिए सभी नौकरी बनाता है। – Raxillan

+0

लेकिन यदि क्लाइंट डी में लिखा नहीं गया है तो मुझे क्या करना चाहिए? जैसे सी कोर कैसे DRuntime वंशज को तत्काल कर सकते हैं? – toriningen

+0

यदि आपको स्पष्ट रूप से सी की आवश्यकता है, तो सी ++ 'कक्षा', 'नया', कन्स्ट्रक्टर/विनाशक समर्थन नहीं है - सामान्य सी-शैली में बस अपने 'init/done' फ़ंक्शंस का उपयोग करें। और यदि आप अभी तक नहीं हैं, तो आप http://dlang.org/cpp_interface.html देख सकते हैं। – Raxillan