2012-05-06 12 views
17

एक त्वरित Google खोज node.js के लिए C++ "Hello World" लिखने के लिए कम से कम एक ट्यूटोरियल उत्पन्न करती है, लेकिन यह स्पष्ट नहीं है कि केवल सी का उपयोग करके ऐसा एक्सटेंशन लिखना संभव है। मान लीजिए कि यह संभव है, मुझे किस चुनौतियों/सीमाओं का सामना करना पड़ेगा?सी में एक node.js एक्सटेंशन लिखना संभव है (सी ++ नहीं)?

+2

आपके सी ++ ट्यूटोरियल का एक लिंक – lupz

+0

https://www.cloudkick.com/blog/2010/aug/23/writing-nodejs-native मदद करेगा -extensions/ – noahlz

उत्तर

15

यदि आप चाहें तो सी में अपने एक्सटेंशन के कुछ हिस्सों को लिख सकते हैं, लेकिन आपको कम से कम सी ++ कोड की आवश्यकता होगी ताकि आपके सी कोड को नोड के साथ चिपकाया जा सके।

जैसा कि आपने अपने हैलोवर्ल्ड में देखा होगा, एक्सटेंशन v8.h और node.h हेडर पर निर्भर हैं, जिनमें नोड की अपेक्षा रखने वाली सभी कक्षाएं हैं। उन लोगों के बिना, आप नोड पर वापस निर्यात करने के लिए जेएस ऑब्जेक्ट को सही ढंग से बनाने में सक्षम नहीं होंगे।

उसने कहा, आप आसानी से सी ++ कार्यों का एक छोटा सा सेट लिख सकते हैं जो केवल सी कार्यों को कॉल करते हैं, और किसी प्रकार की सी संरचना को लपेटते हैं।

2

कोड जो सीधे node.js के साथ इंटरैक्ट करता है उसे सी ++ में लिखा जाना चाहिए।

आप सकता हैextern "C" सब कुछ आप node.h और v8.h से जरूरत के लिए अपारदर्शी प्रकार का उपयोग रैपर बारे में, लेकिन यह शायद आसान है बस सी का उपयोग करने के ++ के बजाय (जो, ज़ाहिर है, सी कोड के लिए बाहर कॉल कर सकते हैं)।

8

पर हैकर समाचार इस मिला:

https://github.com/wesolows/v8plus

v8 +: नोड ऐड-ऑन सी ++ सी सीमा को

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

#define BUILDING_NODE_EXTENSION 
#include <node.h> 

extern "C" void f(int i, char c, float x); 

using namespace v8; 

यदि आप कई सी कार्यों, तो यह के माध्यम से बांटा जा सकता है:

उदाहरण निर्वासन का उपयोग कर अपने सी ++ कोड में अलग-अलग सी समारोह की घोषणा करने के

+0

ऐसा लगता है कि यह संस्करण> Node.js 0.10 के लिए काम नहीं करेगा, बस सुनिश्चित करने के लिए एक समस्या दायर की –

5

आवश्यकता "सी" वाक्य रचना धनुकोष्ठक:

extern "C" { 
    void f(int i, char c, float x); 
    int g(char* s, char const* s2); 
    double sqrtOfSumOfSquares(double a, double b); 
} 

तो सी ++ समारोह से फ़ंक्शन को कॉल करें:

Handle<Value> MyFunction(const Arguments& args) { 
    HandleScope scope; 
    f(7, 'x', 3.14); // <--- 
    return scope.Close(String::New("Hello")); 
} 

Handle<Value> CreateFunction(const Arguments& args) { 
    HandleScope scope; 

    Local<FunctionTemplate> tpl = FunctionTemplate::New(MyFunction); 
    Local<Function> fn = tpl->GetFunction(); 
    fn->SetName(String::NewSymbol("theFunction")); // omit this to make it anonymous 

    return scope.Close(fn); 
} 

void Init(Handle<Object> target) { 
    target->Set(String::NewSymbol("createFunction"), 
     FunctionTemplate::New(CreateFunction)->GetFunction()); 
} 


NODE_MODULE(addon, Init) 

नोट: नमूना कोड का उपयोग कर से Nodejs Addons

5
अब

हमारे पास कम से कम 3 अच्छा विकल्प:

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

बड़ा घूँट: सरलीकृत आवरण और इंटरफेस जेनरेटर
(एक ही बार में कई समस्याओं यह कई भाषाओं के लिए रैपर उत्पन्न करता है, क्या हल करती है)
http://www.swig.org/

emscripten
उच्च optimizable जावास्क्रिप्ट कि यहां तक ​​कि पास देशी गति से वेब पर प्लगइन के बिना ही चलाता है, में संकलित C और C++।
http://kripken.github.io/emscripten-site/

0

यदि आपका मॉड्यूल libuv का उपयोग करता है तो आप इसे निष्पादन योग्य नोड से लिंक कर सकते हैं। यह libuv कार्यों को साझा लाइब्रेरी के रूप में निर्यात करता है।

फिर आप इसके साथ इंटरफेस करने के लिए नोड-एफएफआई का उपयोग कर सकते हैं (कोई सी ++ ज्ञान यहां आवश्यक नहीं है)।

  • MSVS में एक नया DLL समाधान
  • libuv डाउनलोड करें और कॉपी बनाएं शामिल हैं और करने के लिए MSVS
  • डाउनलोड lib फ़ाइलें:

    यहाँ मैं कैसे यह Windows पर बनाया है, का उपयोग कर MSVS है node.lib फ़ाइल और MSVS

  • की lib फ़ोल्डर
  • उदाहरण स्रोत संकलित में रख नीचे है कि मुख्य समारोह पाश
लिए एक टाइमर कहते हैं

testlib.c:

#include <stdio.h> 
#include <stdlib.h> 
#include "uv.h" 

void (*p_callback)(int number, char *text); 

void timer_cb1 (uv_timer_t* timer, int status) { 
    printf("libuv timer here\n", status); 
    p_callback(123, "it worked!"); 
} 

void set_timer (int interval, void *pfunction) { 
    uv_loop_t *loop; 
    uv_timer_t *timer1; 

    printf("set_timer called. interval=%d callback=%p\n", interval, pfunction); 

    p_callback = pfunction; 

    printf("uv_version_string = %s\n", uv_version_string()); 

    loop = uv_default_loop(); 
    if (loop == 0) { 
    puts("could not get the reference to the default loop"); 
    return; 
    } 

    puts("got the default loop. now allocating the timer struct"); 

    timer1 = (uv_timer_t *) malloc(sizeof(uv_timer_t)); 
    if (timer1 == 0) { 
    puts("malloc failed"); 
    return; 
    } 

    puts("initializing timer"); 
    uv_timer_init(loop, timer1); 

    puts("starting timer"); 
    uv_timer_start(timer1, (uv_timer_cb) &timer_cb1, interval, interval); 

    puts("timer created. returning"); 

} 

testlib.def का उपयोग करें:

EXPORTS set_timer 

और node.lib

  • से जोड़ने के लिए याद परीक्षण फ़ोल्डर के लिए बनाया dll ले जाएँ और इन आदेशों को वहां चलाएं:

npm install ffi (वर्तमान में निर्माण उपकरण की आवश्यकता है। निर्देशों की जांच)

node test-lib.js

परीक्षण lib.js यहाँ है:

var ffi = require('ffi'); 

var testlib = ffi.Library('testlib', { 
    'set_timer': [ 'void', [ 'int', 'pointer' ] ] 
}); 

var callback = ffi.Callback('void', ['int', 'string'], 
    function(number, text) { 
    console.log("javascript callback here!!! number=" + number + " text=" + text); 
    } 
); 

console.log('registering the callback...'); 
testlib.set_timer(500, callback); 
console.log('done') 

अपनी कल्पना का प्रयोग करें। हमारे पास नेटवर्किंग, वर्कर थ्रेड और libuv के अंदर अन्य विकल्प हैं ...

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