2013-09-05 8 views
5

मैं अपने Node.js एप्लिकेशन में बाहरी सी ++ लाइब्रेरी को एकीकृत करने की कोशिश कर रहा हूं (मेरे पास .so फ़ाइल के साथ-साथ हेडर फाइलों तक पहुंच है) ।Node.js से कॉल सी ++ लाइब्रेरी (नोड एडॉन्स/नोड-एफएफआई)

  1. मैं नहीं बता सकता नोड ffi के GitHub की परिभाषा से एक Node addon

  2. उपयोग node-ffi

लेखन:

अनुसंधान के एक बहुत बाद मेरे विकल्प रह गए हैं अगर यह सी ++ पुस्तकालयों पर सीधे काम करेगा या नहीं करेगा:

नोड ffi लोड हो रहा है और शुद्ध जावास्क्रिप्ट का उपयोग गतिशील पुस्तकालयों फोन करने के लिए एक Node.js ऐड-ऑन है। इसका उपयोग देशी पुस्तकालयों को किसी भी सी ++ कोड के बिना बाइंडिंग बनाने के लिए किया जा सकता है।

तो सवाल मेरे पास है कर रहे हैं:

  • विकल्प 1) किसी तरह से बाहरी सी ++ पुस्तकालय को फिर से लिखने का मतलब है?
  • नोड ffi सी आवरण के किसी भी प्रकार मैं लिखने के लिए होगा बिना सेल्सियस तक ++ पुस्तकालयों सीधे कॉल करने में सक्षम है?

मैं जब यह C++/सी की बात आती है, तो अगर मैं कुछ बुनियादी याद किया आप जवाब देने के लिए मुझे बताएं ताकि मैं मेरे सवाल का सुधार कर सकते हैं तो कृपया सक्षम होने के लिए के लिए कोई विशेषज्ञ हूँ।

+0

एक समान प्रश्न है: http://stackoverflow.com/questions/16783023/node-ffi-vs-node-extension-for-accessing-existing-c- कार्यक्षमता?rq=1 लेकिन मुझे लगता है कि यह मेरे सवालों का पूरी तरह उत्तर नहीं देता है। –

उत्तर

4

नोड ffi सी कार्यक्रमों के लिए मुख्य रूप से हो रहा है। मैं पिछले हफ्ते में इस माध्यम से चला गया, और नोड एडॉन्स के साथ बहुत अच्छी किस्मत पाई। आपको क्या करना है पुस्तकालय में C++ कोड और node.js. के बीच एक शिम लिखना है। मेरे मामले में, मुझे सुरक्षा प्रोटोकॉल के लिए पैकेट को एन्कोड और डीकोड करने की आवश्यकता थी, इसलिए मैंने नोड बफर बनाए जिनमें पैकेट शामिल थे, और सी ++ कोड लिखा था, जिसमें बफर से डेटा मिला, फिर डेटा को मेरे सी कोड में भेज दिया गया जो एन्कोड किया गया था और डीकोडेड पैकेट्स

यह पृष्ठ: http://luismreis.github.io/node-bindings-guide/docs/returning.html सी में में और Node.js बफ़र्स से बाहर डेटा प्राप्त करने के लिए कैसे ++ के कुछ महान उदाहरण है।

+1

एफएफआई सी ++ के साथ काम करता है, बस अपने lib के इंटरफेस को परिभाषित करने के लिए बाहरी "सी" का उपयोग करें (जैसा कि आप सी ++ में लिखे गए किसी भी चीज के साथ सी द्वारा भी खाया जा सकता है) http://stackoverflow.com/questions/16783023/node-ffi देखें विवरण के लिए -vs-node-extension-access-access-current-c-कार्यक्षमता? rq = 1। – konsumer

2

अन्य जवाब से क्या याद आ रही है? मदद करके मुझे खुशी होगी। सी ++ में कोड उदाहरण लिखा गया है। मैं यह बता रहा हूं कि लोग (जो सी या सी ++ में पुस्तकालय बनाते हैं) दूसरों के उपभोग के लिए बाहरी इंटरफेस को परिभाषित करते हैं। एफएफआई का मुद्दा यह है कि आप सी/सी ++ (जैसे नोड एक्सटेंशन के मामले में) के बजाए आप जिस भी भाषा का उपयोग कर रहे हैं (इस मामले में जावास्क्रिप्ट) में अपना रैपर लिखें। यदि आपकी मूल लाइब्रेरी एक साझा डीएलएल है जो अन्य चीजों में उपयोग की जाती है, इसमें पहले से ही एक इंटरफ़ेस है, आपको केवल जावास्क्रिप्ट में रैपर-कोड लिखने की आवश्यकता है ताकि यह सी ++ में कुछ लिखने के बजाय नोड को बताए और इसे मूल नोडजेस लाइब्रेरी में बेनकाब कर सके।

+0

आप यहां जानकारी प्राप्त कर सकते हैं https://github.com/rbranson/node-ffi/wiki/Node-FFI- ट्यूटोरियल जो स्क्लाइट के कुछ तरीकों को लपेटने का एक उदाहरण है। तथ्य यह है कि lib सी या सी ++ अप्रासंगिक है, बस यह एक इंटरफेस को परिभाषित करता है (जैसे सभी साझा पुस्तकालय करते हैं।) – konsumer

2

nbind अब यह आसान बाहरी सी ++ लाइब्रेरी का उपयोग कर Node.js एडऑन लिखने के लिए बनाता है। आप मूल रूप से लाइब्रेरी हेडर, एनबीआईंड हेडर और कुछ मैक्रो कॉल लाइब्रेरी के वर्गों और विधियों को सूचीबद्ध करते हुए एक नई स्रोत फ़ाइल बनाते हैं। फिर nbind बाकी संभालती है।

libui-node Node.js. से देशी विजेट्स के साथ उपयोगकर्ता इंटरफेस उत्पन्न करने के लिए libui पर कॉल करने के लिए nbind का उपयोग करके वास्तविक दुनिया का उदाहरण है। short tutorialvg, बायोइनफॉरमैटिक्स से संबंधित सी ++ लाइब्रेरी के लिए बाइंडिंग कैसे बनाएं।

0

आपकी लाइब्रेरी को जोड़ने का बहुत आसान तरीका है (.so .dll .a)। आप binging.gyp फ़ाइल में सही पथ के साथ पुस्तकालय जोड़ना चाहिए:

{ 
    "targets": [ 
    { 
     "target_name": "addon", 
     "sources": [ "hello.cc" ], 
     "libraries": [ 
      "path/toYourLibrary/yourLibName.dll or yourLibName.so" 
      ] 
    } 
    ] 
} 

इसके अलावा वहाँ nan का उपयोग कर अच्छा एडऑन लिखने के लिए और अधिक आसान तरीका। अधिक जानकारी के लिए लिंक देखें github link

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