2009-10-27 6 views
17

आज मैंने डी प्रोग्रामिंग के बारे में सुना और यह सी कोड के अनुकूल है। फिर भी मुझे कोई जानकारी नहीं मिली है कि डी से जीटीके या पोर्टऑडियो जैसे सी पुस्तकालयों का उपयोग करना संभव है या नहीं? यदि यह संभव है, तो क्या आप यह समझा सकते हैं कि यह कैसे करें?डी से सी पुस्तकालय का उपयोग कैसे करें?

उत्तर

18

डी से सी पुस्तकालयों को कॉल करना संभव है। सी हेडर फ़ाइलों को डी में परिवर्तित करने के लिए आपको क्या करना है। अधिकांश भाग के लिए यह बहुत सरल है, और उपयोग करने में कठोर उपयोग command-line tool है प्रक्रिया स्वचालित करें। खिलौनों के उदाहरणों के अलावा यह वास्तव में मेरे लिए कभी भी काम नहीं करता है, लेकिन यह बदलने की ज़रूरत है कि किस तरह के बदलाव किए जाने की जरूरत है। बस एक स्निपेट डालें जिसमें आपको हेडर में अनुवाद करने में परेशानी हो रही है और देखें कि इसके साथ क्या है।

सबसे बड़ी समस्या जो आपको आम तौर पर मिलती है वह सी प्रीप्रोसेसर का रचनात्मक उपयोग है। कुछ चीजों को डी में संस्करण() कथन में बदल दिया जा सकता है, लेकिन सभी नहीं।

वास्तव में कोड के साथ संकलन और लिंक करने के लिए, यूनिक्स जैसी प्लेटफ़ॉर्म पर मुझे लगता है कि आप जीसीसी का उपयोग करके सी कोड में संकलित और लिंक कर सकते हैं। विंडोज़ पर आपको या तो डीएमसी का उपयोग करके सी फाइलों को संकलित करना होगा और डीएमडी से लिंक करना होगा। या आप सी कोड को किसी भी कंपाइलर का उपयोग करके डीएलएल में संकलित कर सकते हैं, और उसके बाद डीएमडी से लिंक करने के लिए आपको डीएलएल से डीएमडी-संगत आयात lib बनाने की आवश्यकता है। यह DigitalMars से उपलब्ध Basic Utilities Package में पाए गए इम्प्लिब टूल का उपयोग करके किया जा सकता है।

इनमें से बहुत सारे हेडर अनुवाद पहले से ही किए जा चुके हैं। पहले डीएसओएस की Bindings प्रोजेक्ट ब्राउज़ करना उपयोगी है, या जीटीके हेडर का अनुवाद करने की तरह कुछ बड़ा शुरू करने से पहले डिजिटाल्मर डी न्यूज ग्रुप से पहले पूछें। जीटीके जैसे लोकप्रिय पुस्तकालयों का एक बहुत पहले से ही लिपटे दिया है (उदाहरण के लिए यहाँ: GTKD)

4

डी कोड सी ऑब्जेक्ट फाइलों से जोड़ा जा सकता है, और सी डीएलएस के साथ बातचीत कर सकता है, लेकिन आपको उस सी हेडर फ़ाइल से डी मॉड्यूल जेनरेट करना होगा जिसे आप उपयोग करना चाहते हैं। आधिकारिक डी वेबसाइट में बहुत कुछ करने के लिए a guide है।

1

आप सी बाइंडिंग लिखने की ज़रूरत के साथ शुरू प्राप्त करने के लिए मदद कर सकता है कर रहे हैं। This answer बताते हैं कि कैसे।

4

लोकप्रिय विकल्प रन-टाइम के दौरान लाइब्रेरी को लोड करना है।

module libpngtest; 

import std.stdio; 
import core.sys.posix.dlfcn; 

alias uint function() png_access_version_number_t; 

int main() { 
    auto lib = dlopen("libpng.so".ptr, RTLD_LAZY | RTLD_LOCAL); 
    if (lib is null) { 
    writeln("EEEK!"); 
    writeln(to!string(dlerror())); 
    return -1; 
    } else { 
    writeln("WOOT!"); 
    auto png_access_version_number = cast(png_access_version_number_t)dlsym(lib, "png_access_version_number"); 
    writeln(png_access_version_number()); 
    } 

    if (dlclose(lib) == 0) { 
    return 0; 
    } else { 
    return -1; 
    } 
} // main() function 

// compile: dmd libpngtest.d -L-ldl 
// run:  ./libpngtest 

यह परीक्षण करने के लिए DPaste का उपयोग करें:: http://www.dpaste.dzfl.pl/917bc3fb

यहाँ एक उदाहरण है कि कैसे libpng लोड और एक libpng समारोह कॉल करने के लिए है
संबंधित मुद्दे