से साझा साझा पुस्तकालयों में लिखने वाले लिप्यंतरण को कॉल करना मैं डी में गतिशील साझा पुस्तकालयों के साथ त्वरित रूप से प्रारंभ करने की कोशिश कर रहा हूं, लेकिन मुझे कोई समस्या है।डी 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() अभी भी सेगमेंटेशन गलती के साथ विफल रहता है।
शायद, इसके बजाय RAII का उपयोग करें? इसलिए, नई कक्षा 'ड्रंटटाइम' बनाएं और अपने 'init' फ़ंक्शन को कन्स्ट्रक्टर,' किया '- विनाशक को जोड़ें। तो, ग्राहक सिर्फ इस वर्ग का उद्देश्य बनाते हैं - और यह हमारे लिए सभी नौकरी बनाता है। – Raxillan
लेकिन यदि क्लाइंट डी में लिखा नहीं गया है तो मुझे क्या करना चाहिए? जैसे सी कोर कैसे DRuntime वंशज को तत्काल कर सकते हैं? – toriningen
यदि आपको स्पष्ट रूप से सी की आवश्यकता है, तो सी ++ 'कक्षा', 'नया', कन्स्ट्रक्टर/विनाशक समर्थन नहीं है - सामान्य सी-शैली में बस अपने 'init/done' फ़ंक्शंस का उपयोग करें। और यदि आप अभी तक नहीं हैं, तो आप http://dlang.org/cpp_interface.html देख सकते हैं। – Raxillan