मैं नोड.जेएस से सी ++ लाइब्रेरी का उपयोग कैसे कर सकता हूं?


130

मैं नोड.जेएस से सी ++ लाइब्रेरी का उपयोग कैसे कर सकता हूं?


9
कुंजी शब्द है extension। Google c ++ नोडज एक्सटेंशन
पीटर वुड

5
इस लिंक पर जाओ। इसने एक नमूना कार्यक्रम प्रदान किया है और इसे चरण दर चरण समझाया है। benfarrell.com/2013/01/03/…

जवाबों:


66

को देखो नोड ffi

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


5
विभिन्न C ++ कंपाइलर अलग-अलग ABI बनाते हैं, इसलिए नोड- ffi का उपयोग करने के लिए आपको C इंटरफ़ेस के साथ अपने C ++ कोड को लपेटना पड़ सकता है - या कम से कम मैंने विजुअल स्टूडियो के साथ विंडोज पर यह काम करने के लिए किया। यह कैसे करें के विवरण के लिए stackoverflow.com/questions/2045774/… देखें । या मैं एक आवरण के बिना C ++ पर नोड-एफएफआई का उपयोग करने में सक्षम होना चाहिए?
पैनकेक

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

मैं वी.एस. 2017/2019 में नोड-एफएफआई के साथ संकलित मुद्दों पर भाग गया। यह एक प्रमुख PITA है! क्या यह पायथन 2.7 पर निर्भर है या सिर्फ निर्माण प्रक्रिया है? मानक Win32 DLL के लिए NodeJS में एक LoadLibrary तंत्र होना चाहिए?
त्रागपमान

78

अब उस सवाल का एक ताजा जवाब है। संस्करण 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 इन बातों का पता लगाता है, और स्वचालित रूप से प्राकृतिक इंटरफेस उत्पन्न करता है।


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

5
@George SWIG वास्तव में एक अद्भुत उपकरण है, लेकिन यह जादू नहीं है, और यह कुछ सामान्य AI नहीं है जो आपके C ++ कोड के शब्दार्थ को समझ सकता है और संबंधित इंटरफ़ेस उत्पन्न कर सकता है। कृपया ध्यान दें कि कैसे C ++ का और जावास्क्रिप्ट का शब्दार्थ, स्वामित्व अवधारणा और आजीवन प्रबंधन मौलिक रूप से भिन्न हैं।
enobayram

3
इसलिए आप SWIG को दो तरीकों से देख सकते हैं: यह एक ऐसा उपकरण है जो वह कर सकता है जो यह बॉक्स से बाहर कर सकता है, और इसके नियमों द्वारा खेल सकता है। इसका मतलब है कि, आपको जावास्क्रिप्ट ऐरे को C ++ फ़ंक्शंस से बाहर देखने की उम्मीद नहीं करनी चाहिए जो एरेज़ लौटाते हैं। आप इसके बजाय अपने फ़ंक्शन को C ++ में लपेटने के लिए कर सकते हैं ताकि यह एक ऑब्जेक्ट लौटाए जो एक सरणी ( std::vector<>उदाहरण के लिए, बस %include "std_vector.i") की तरह व्यवहार करता है , और आप इसे कुछ अजीब तरीके से जावास्क्रिप्ट पक्ष पर हेरफेर करने में सक्षम होंगे। ध्यान दें कि यह दृष्टिकोण अभी भी आसान है और अपने आप को एफएफआई लिखने से अधिक सुरक्षित है।
enobayram

3
दूसरा तरीका जो आप SWIG का उपयोग कर सकते हैं, वह है नीचे की मशीनरी को समझना। इसका उपयोग करते हुए कुछ महीने बिताएं, इसकी विशेषताओं को गहराई से जानें। तब आप इसे अपने इच्छित इंटरफ़ेस को उत्पन्न कर सकते हैं। आप चाहते हैं कि यह एक C ++ सरणी के लिए एक जावास्क्रिप्ट सरणी लौटाए, ठीक है, आप यह कर सकते हैं, लेकिन आपको पहले यह सीखना चाहिए कि आप इस तरह के इंटरफ़ेस में जो सटीक शब्दार्थ की अपेक्षा करते हैं उसे कैसे व्यक्त करें और सुनिश्चित करें कि यह आपकी समस्या डोमेन के लिए अच्छी तरह से मैप करता है।
enobayram

3
किसी भी तरह से, मैं आपको पहले दृष्टिकोण के साथ शुरू करने की सलाह देता हूं, और रास्ते में SWIG के आपके उपयोग को परिष्कृत करता हूं। यह अध्ययन करने के लिए काफी प्रेरणादायक है कि SWIG आपके कोड का क्या करता है और आप इसे कैसे जोड़ सकते हैं।
enobayram


11

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


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

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

1
- यदि ओपी का लक्ष्य संकलित सी ++ के प्रदर्शन लाभ प्राप्त करना है - तो कुछ लाभ एम्सस्क्रिप्टेन के साथ अनुवाद करते हैं, विशेष रूप से डब्ल्यूएएसएम के साथ: कोई जीसी ओवरहेड, कम पार्सिंग और जेआईटी ओवरहेड, देशी पूर्णांक, एओटी योग्यता।
आर्टेमग्र जूल

2

Node.js और C ++ को जोड़ने के नए तरीके। कृपया, नान पर लूट ।

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


1

यहाँ आपका C ++ वेब पर Node.js के साथ प्राप्त करने पर एक दिलचस्प लेख है

Node.js एप्लिकेशन के साथ C ++ कोड को एकीकृत करने के तीन सामान्य तरीके - हालांकि प्रत्येक श्रेणी के भीतर बहुत सारे बदलाव हैं:

  1. स्वचालन - अपने सी ++ को एक बच्चे की प्रक्रिया में एक स्टैंडअलोन ऐप के रूप में कॉल करें।
  2. साझा लाइब्रेरी - अपने C ++ रूटीन को एक साझा लाइब्रेरी (dll) में पैक करें और उन रूटीन को Node.js से सीधे कॉल करें।
  3. Node.js Addon - अपने C ++ कोड को एक देशी Node.js मॉड्यूल / एडऑन के रूप में संकलित करें।

0

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 या बाद के संस्करण हैं।


मुझे समझ नहीं आ रहा है कि SWIG की परिभाषा क्या होगी foo::bar। एक वर्ग के सदस्य की परिभाषा कार्यान्वयन के बारे में है; रैपर जो SWIG उत्पन्न करते हैं, वे सभी इंटरफ़ेस के बारे में हैं।
enobayram
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.