मैं नोड.जेएस से सी ++ लाइब्रेरी का उपयोग कैसे कर सकता हूं?
मैं नोड.जेएस से सी ++ लाइब्रेरी का उपयोग कैसे कर सकता हूं?
जवाबों:
को देखो नोड ffi ।
नोड- ffi शुद्ध जावास्क्रिप्ट का उपयोग करके गतिशील पुस्तकालयों को लोड करने और कॉल करने के लिए एक नोड.जेएस एडऑन है। इसका उपयोग किसी भी C ++ कोड को लिखे बिना देशी पुस्तकालयों में बाइंडिंग बनाने के लिए किया जा सकता है।
अब उस सवाल का एक ताजा जवाब है। संस्करण 3.0 के रूप में SWIG , Node.js, Webkit और v8 के लिए जावास्क्रिप्ट इंटरफ़ेस जनरेटर प्रदान करता है ।
मैं थोड़ी देर के लिए जावा और पायथन के लिए बड़े पैमाने पर SWIG का उपयोग कर रहा हूं, और एक बार जब आप समझ जाते हैं कि 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;
}
};
नोड में इस वर्ग का उपयोग करने के लिए, आप बस निम्नलिखित SWIG इंटरफ़ेस फ़ाइल (mylib.i) लिखें:
%module "mylib"
%{
#include "myclass.h"
%}
%include "myclass.h"
बाइंडिंग फ़ाइल बाइंडिंग बनाएँ। जिप:
{
"targets": [
{
"target_name": "mylib",
"sources": [ "mylib_wrap.cxx" ]
}
]
}
निम्न आदेश चलाएँ:
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
कहीं भी विधि का उल्लेख नहीं करना है , SWIG इन बातों का पता लगाता है, और स्वचालित रूप से प्राकृतिक इंटरफेस उत्पन्न करता है।
std::vector<>
उदाहरण के लिए, बस %include "std_vector.i"
) की तरह व्यवहार करता है , और आप इसे कुछ अजीब तरीके से जावास्क्रिप्ट पक्ष पर हेरफेर करने में सक्षम होंगे। ध्यान दें कि यह दृष्टिकोण अभी भी आसान है और अपने आप को एफएफआई लिखने से अधिक सुरक्षित है।
आप अपने C ++ कोड के लिए बाइंडिंग प्रदान करने के लिए एक नोड .js एक्सटेंशन का उपयोग कर सकते हैं। यहाँ एक ट्यूटोरियल है जो कवर करता है:
http://syskall.com/how-to-write-your-own-native-nodejs-extension
आप C ++ कोड को js में संकलित करने के लिए emscripten का उपयोग कर सकते हैं ।
यहाँ आपका C ++ वेब पर Node.js के साथ प्राप्त करने पर एक दिलचस्प लेख है
Node.js एप्लिकेशन के साथ C ++ कोड को एकीकृत करने के तीन सामान्य तरीके - हालांकि प्रत्येक श्रेणी के भीतर बहुत सारे बदलाव हैं:
- स्वचालन - अपने सी ++ को एक बच्चे की प्रक्रिया में एक स्टैंडअलोन ऐप के रूप में कॉल करें।
- साझा लाइब्रेरी - अपने C ++ रूटीन को एक साझा लाइब्रेरी (dll) में पैक करें और उन रूटीन को Node.js से सीधे कॉल करें।
- Node.js Addon - अपने C ++ कोड को एक देशी Node.js मॉड्यूल / एडऑन के रूप में संकलित करें।
Swig और C ++ के साथ बने: http://www.swig.org/Doc1.3/SWIG.html#SWIG_nn8
C ++ स्रोत फ़ाइलों पर SWIG चलाना (.C या .xxxx फ़ाइल में क्या दिखाई देगा) अनुशंसित नहीं है। भले ही SWIG C ++ वर्ग की घोषणाओं को पार्स कर सकता है, लेकिन यह उन घोषणाओं को नजरअंदाज कर देता है जो उनकी मूल कक्षा परिभाषा से अलग कर दी जाती हैं (घोषणाएं पार्स की जाती हैं, लेकिन बहुत सारे चेतावनी संदेश उत्पन्न हो सकते हैं)। उदाहरण के लिए:
/* Not supported by SWIG */ int foo::bar(int) { ... whatever ... }
यह शायद ही कभी केवल एक .h फ़ाइल तक सीमित C ++ वर्ग है।
इसके अलावा, जावास्क्रिप्ट का समर्थन करने वाले swig के संस्करण swig-3.0.1 या बाद के संस्करण हैं।
foo::bar
। एक वर्ग के सदस्य की परिभाषा कार्यान्वयन के बारे में है; रैपर जो SWIG उत्पन्न करते हैं, वे सभी इंटरफ़ेस के बारे में हैं।
extension
। Google c ++ नोडज एक्सटेंशन