2012-03-09 13 views
112

मैं node.js से C++ लाइब्रेरी का उपयोग कैसे कर सकता हूं?मैं node.js से C++ लाइब्रेरी का उपयोग कैसे कर सकता हूं?

+8

कुंजी शब्द 'एक्सटेंशन' है। Google [C++ nodejs एक्सटेंशन] (https://www.google.co.uk/search?q=c%2B%2B+nodejs+extension) –

+5

इस लिंक का अनुसरण करें। इसने एक नमूना कार्यक्रम प्रदान किया है और इसे चरण-दर-चरण समझाया है। http://www.benfarrell.com/2013/01/03/c-and-node-js-an-unholy-combination-but-oh-so-right/ –

उत्तर

56

देखो।

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

+4

विभिन्न सी ++ कंपाइलर विभिन्न एबीआई बनाते हैं, इसलिए नोड का उपयोग करने के लिए -फि आपको अपने सी ++ कोड को सी इंटरफ़ेस के साथ लपेटना पड़ सकता है - या कम से कम मैंने इसे विजुअल स्टूडियो के साथ विंडोज पर काम करने के लिए किया था। इसे कैसे करें इस पर विवरण के लिए http://stackoverflow.com/questions/2045774/developing-c-wrapper-api-for-object-oriented-c-code देखें। या मैं एक आवरण के बिना सी ++ पर नोड-एफएफआई का उपयोग करने में सक्षम होना चाहिए? – pancake

+0

मुझे पता है कि यह टिप्पणियों के बाद से एक वर्ष से अधिक है लेकिन ... सी सी ++ libs का उपयोग सी सी रैपर के बिना करना संभव है? –

+5

* chirp chirp * इस प्रश्न पर कोई भी अपडेट^ –

18

आप अपने सी ++ कोड के लिए बाइंडिंग प्रदान करने के लिए node.js एक्सटेंशन का उपयोग कर सकते हैं। यहाँ एक ट्यूटोरियल है कि शामिल किया गया है कि: node-ffi पर

http://syskall.com/how-to-write-your-own-native-nodejs-extension

10

आप emscripten का उपयोग js में सी ++ कोड संकलित करने के लिए कर सकता है।

+15

यह एक बुरा विचार होगा यदि ओपी का लक्ष्य संकलित सी ++ के प्रदर्शन लाभ प्राप्त करना है, और pedantic होने के लिए यह सवाल का जवाब नहीं देता है। – Greg

+6

@ ग्रेग लेकिन फिर भी यह विचार करने योग्य विचार है। लोग विभिन्न प्रकार की परियोजनाओं के लिए इस पृष्ठ पर आते हैं। मुझे लगता है कि जब आपके पास सी/सी ++ कोड बेस है और सिर्फ इसे नोडज में उपयोग करना चाहते हैं तो एम्सस्क्रिप्टन एक अच्छा विकल्प है। – AlexStack

71

अब उस प्रश्न का एक नया जवाब है। SWIG, संस्करण 3.0 के रूप में Node.js, वेबकिट और v8 के लिए javascript interface generators प्रदान करता है।

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

एक छोटा सा उदाहरण के रूप में, आप शीर्ष लेख myclass.h के साथ एक पुस्तकालय है कहते हैं:

#include<iostream> 

class MyClass { 
     int myNumber; 
public: 
     MyClass(int number): myNumber(number){} 
     void sayHello() { 
       std::cout << "Hello, my number is:" 
       << myNumber <<std::endl; 
     } 
}; 

आदेश नोड में इस वर्ग का उपयोग करने के लिए, आप बस निम्नलिखित बड़ा घूँट इंटरफ़ेस फ़ाइल लिखने में (mylib.i) :

{ 
    "targets": [ 
    { 
     "target_name": "mylib", 
     "sources": [ "mylib_wrap.cxx" ] 
    } 
    ] 
} 

भागो निम्नलिखित कमांडरों:

%module "mylib" 
%{ 
#include "myclass.h" 
%} 
%include "myclass.h" 

बाध्यकारी फ़ाइल binding.gyp बनाएं डी एस:

swig -c++ -javascript -node mylib.i 
node-gyp build 

अब, एक ही फ़ोल्डर से नोड चल रहा है, आप कर सकते हैं:

> var mylib = require("./build/Release/mylib") 
> var c = new mylib.MyClass(5) 
> c.sayHello() 
Hello, my number is:5 

भले ही हम इस तरह के एक छोटे से उदाहरण के लिए 2 इंटरफेस फ़ाइलें लिखने के लिए की जरूरत है, ध्यान दें कि किस प्रकार हम नहीं था MyClass कन्स्ट्रक्टर और न ही sayHello विधि का उल्लेख करना होगा, एसडब्ल्यूआईजी इन चीजों को खोजता है, और स्वचालित रूप से प्राकृतिक इंटरफेस उत्पन्न करता है।

+0

यह अविश्वसनीय रूप से सरल दिखता है! काम के उदाहरण के लिए धन्यवाद –

+0

इस उत्तर ने मुझे स्विग करने के लिए पेश किया, जो अद्भुत है। यह सभी एडन बॉयलरप्लेट कोड को स्वचालित करता है! सच्चा बनने के लिए तो यह बहुत अच्छा है। क्या यहां खेलने पर कुछ प्रकार के बड़े पैमाने पर प्रदर्शन व्यापार बंद है? – George

+1

थोड़ी देर के लिए swig/node.js के साथ खेलने के बाद, ऐसा प्रतीत होता है कि स्विग सी ++ फ़ंक्शंस को संभाल नहीं सकता है जो सरणी लौटाता है (अधिक सटीक: कार्य जो पॉइंटर्स को सरणी में लौटाते हैं)। ऐसा लगता है कि ऐसा लगता है कि आप C++ में कोई फ़ंक्शन नहीं बना सकते हैं जो एक जावास्क्रिप्ट सरणी की तरह कुछ देता है और स्विग स्वचालित रूप से इसे आपके लिए परिवर्तित कर देता है। – George

0

Becareful बड़ा घूँट और सी के साथ ++: http://www.swig.org/Doc1.3/SWIG.html#SWIG_nn8

सी ++ स्रोत फ़ाइलों पर बड़ा घूँट चल रहा है (एक सी या .cxx फ़ाइल में क्या प्रकट होता) अनुशंसित नहीं है। हालांकि एसडब्ल्यूआईजी सी ++ वर्ग घोषणाओं को पार्स कर सकता है, फिर भी यह घोषणाओं को अनदेखा करता है जो उनकी मूल श्रेणी परिभाषा से तय किए जाते हैं (घोषणाएं पार्स की जाती हैं, लेकिन बहुत से चेतावनी संदेश उत्पन्न किए जा सकते हैं)। उदाहरण के लिए:

/* Not supported by SWIG */ 
int foo::bar(int) { 
    ... whatever ... 
} 

यह एक सी ++ वर्ग केवल एक ज फाइल करने के लिए सीमित करने के लिए शायद ही कभी है।

इसके अलावा, स्विम का समर्थन करने वाले स्विग के संस्करण swig-3.0.1 या बाद में हैं।

+0

मुझे समझ में नहीं आता कि एसडब्ल्यूआईजी 'foo :: bar' की परिभाषा के साथ क्या करेगा वैसे भी। कक्षा सदस्य की परिभाषा कार्यान्वयन के बारे में है; एसपीआईजी उत्पन्न करने वाले रैपर इंटरफ़ेस के बारे में हैं। – enobayram

1

नोड.जेएस और सी ++ को जोड़ने के नए तरीके। कृपया, Nan पर लूटें।

EDIT सबसे तेज़ और आसान तरीका nbind है। यदि आप एसिंक्रोनस एड-ऑन लिखना चाहते हैं तो आप नैन से Asyncworker कक्षा को जोड़ सकते हैं।

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

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