আমি কীভাবে নোড.জেএস থেকে সি ++ লাইব্রেরি ব্যবহার করতে পারি?


130

আমি কীভাবে নোড.জেএস থেকে সি ++ লাইব্রেরি ব্যবহার করতে পারি?


9
মূল কথাটি হ'ল extension। গুগল সি ++ নোডেজ এক্সটেনশন
পিটার উড

5
এই লিঙ্কটি অনুসরণ করুন। এটি একটি নমুনা প্রোগ্রাম সরবরাহ করেছে এবং ধাপে ধাপে এটি ব্যাখ্যা করেছে। benfarrell.com/2013/01/03/…

উত্তর:


66

নোড-এফফি তাকান ।

খাঁটি জাভাস্ক্রিপ্ট ব্যবহার করে ডায়নামিক লাইব্রেরি লোড এবং কল করার জন্য নোড-এফআই হ'ল একটি নোড.জেএস অ্যাডোন। এটি কোনও সি ++ কোড না লিখে নেটিভ লাইব্রেরিতে বাইন্ডিং তৈরি করতে ব্যবহৃত হতে পারে।


5
বিভিন্ন সি ++ কম্পাইলার বিভিন্ন এবিআই তৈরি করে, তাই নোড-এফফি ব্যবহার করার জন্য আপনাকে নিজের সি ++ কোডটি একটি সি ইন্টারফেসের সাথে আবৃত করতে হতে পারে - অথবা কমপক্ষে আমি উইন্ডোজটিতে ভিজ্যুয়াল স্টুডিও সহ এই কাজটি করতে পারি। এটি কীভাবে করা যায় তার বিশদ জানতে stackoverflow.com/questions/2045774/… দেখুন । অথবা আমি মোড়ক ছাড়া সি ++ এ নোড-এফফি ব্যবহার করতে সক্ষম হব?
প্যানকেক

1
আমি জানি যে এই মন্তব্যগুলির পরে এক বছরেরও বেশি সময় হয়েছে তবে ... সি র‌্যাপার ছাড়া সি ++ লিবস ব্যবহার করা কি সম্ভব?
মিকি দে আরকেইন

আমি ভিএস 2017/2019 নোড-এফএফআই সহ সমস্যাগুলি সংকলন করে চলেছি। এটি একটি প্রধান পিটা! এটি কি পাইথন ২.7 এর উপর নির্ভরশীল বা এটি কেবল বিল্ড প্রক্রিয়া? একটি আদর্শ উইন 32 ডিএলএল এর জন্য নোডজেএসে অবশ্যই একটি লোডলিবারি ব্যবস্থা থাকতে হবে?
tgraupmann

78

এখন এই প্রশ্নের একটি নতুন উত্তর আছে। SWIG , সংস্করণ 3.0 হিসাবে নোড.জেএস, ওয়েবকিট এবং ভি 8 এর জন্য জাভাস্ক্রিপ্ট ইন্টারফেস জেনারেটর সরবরাহ করে

আমি জাভা এবং পাইথনের জন্য কিছু সময়ের জন্য এসডব্লিউআইজি ব্যবহার করছি, এবং আপনি যখন বুঝতে পারবেন যে SWIG কীভাবে কাজ করে, তখন SWIG যে ভাষাগুলিতে সি ++ কোড ইন্টারফেসিংয়ের জন্য প্রয়োজন হয় প্রায় কোনও প্রচেষ্টা (এফআই বা লক্ষ্য ভাষার সমতুল্যের তুলনায়) প্রয়োজন হয় না S সমর্থন।

একটি ছোট উদাহরণ হিসাবে, বলুন যে আপনার শিরোনাম 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"

বাঁধাই ফাইলটি বাইন্ডিং.gyp তৈরি করুন:

{
  "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পদ্ধতিটি কোথাও উল্লেখ করতে হয়নি , এসডাব্লুআইজি এই জিনিসগুলি আবিষ্কার করে এবং স্বয়ংক্রিয়ভাবে প্রাকৃতিক ইন্টারফেস তৈরি করে।


2
কিছুটা সময় সুইগ / নোড.জেএস এর সাথে খেলার পরে, দেখা যাচ্ছে যে সুইগ সি ++ ফাংশনগুলি পরিচালনা করতে পারে না যা অ্যারে ফিরিয়ে দেয় (আরও সুনির্দিষ্টভাবে: ফাংশনগুলি যা অ্যারেগুলিতে পয়েন্টার দেয়)। এটি হ'ল মনে হচ্ছে আপনি সি ++ তে কোনও ফাংশন তৈরি করতে পারবেন না যা জাভাস্ক্রিপ্ট অ্যারের মতো কিছু দেয় এবং স্বয়ংক্রিয়ভাবে এটি আপনার জন্য রূপান্তর করে।
জর্জ

5
@ জর্জ এসডিজিআই সত্যই একটি আশ্চর্যজনক সরঞ্জাম, তবে এটি যাদু নয় এবং এটি এমন কিছু সাধারণ এআই নয় যা আপনার সি ++ কোডের শব্দার্থবিজ্ঞান বুঝতে পারে এবং একটি সম্পর্কিত ইন্টারফেস তৈরি করতে পারে। সি ++ এর এবং জাভাস্ক্রিপ্টের শব্দার্থকতা, মালিকানা ধারণা এবং আজীবন পরিচালন কীভাবে মৌলিকভাবে পৃথক সে বিষয়ে দয়া করে মনোযোগ দিন।
এনোবায়রাম

3
সুতরাং আপনি দুটি উপায়ে SWIG দেখতে পারেন: এটি এমন একটি সরঞ্জাম যা বাক্সের বাইরে যা করতে পারে তা করতে পারে এবং এর নিয়ম অনুসারে খেলতে পারে। তার মানে, আপনার জাভাস্ক্রিপ্ট অ্যারেগুলি সি ++ ফাংশনগুলি পপ আউট দেখবে তা প্রত্যাশা করা উচিত নয় that পরিবর্তে আপনি যা করতে পারেন তা হ'ল সি ++ এ আপনার ফাংশনটি মোড়ানো যাতে এটি কোনও অ্যারের মতো আচরণ করে এমন কোনও বস্তু ফেরত দেয় ( std::vector<>উদাহরণস্বরূপ, ন্যায়সঙ্গত %include "std_vector.i") এবং আপনি এটি জাভাস্ক্রিপ্টের দিক থেকে কিছুটা বিশ্রী পথে চালিত করতে সক্ষম হবেন। মনে রাখবেন যে এই পদ্ধতিটি এফএফআই নিজে লেখার চেয়ে এখনও সহজতর এবং নিরাপদ।
এনোবায়রাম

3
আপনি SWIG অন্যান্য যেভাবে ব্যবহার করতে পারেন তা হ'ল নীচের যন্ত্রপাতিগুলি বোঝা। এটি ব্যবহার করে কয়েক মাস ব্যয় করুন, এর বৈশিষ্ট্যগুলি গভীরতায় শিখুন। তারপরে আপনি এটি আপনার পছন্দমতো ইন্টারফেস তৈরি করতে পারেন। আপনি চান এটি একটি সি ++ অ্যারের জন্য একটি জাভাস্ক্রিপ্ট অ্যারে ফিরিয়ে দিতে পারে, জরিমানা, আপনি এটি করতে পারেন, তবে আপনাকে প্রথমে এমন ইন্টারফেসে প্রত্যাশা করা সঠিক শব্দার্থতাকে কীভাবে প্রকাশ করা উচিত তা শিখতে হবে এবং এটি নিশ্চিত হওয়া উচিত যে এটি আপনার সমস্যার ডোমেনে সঠিকভাবে ম্যাপ করে।
এনোবায়রাম

3
যে কোনও উপায়ে, আমি আপনাকে প্রথম পদ্ধতির সাথে শুরু করার পরামর্শ দিচ্ছি, এবং পথে এসডিজিআইজি ব্যবহারটি আরও পরিমার্জন করব। SWIG আপনার কোডটি কী করে এবং আপনি কীভাবে এটি ব্যবহার করতে পারেন তা অধ্যয়ন করার জন্য এটি যথেষ্ট অনুপ্রেরণামূলক।
এনোবায়রাম

20

আপনি আপনার সি ++ কোডের জন্য বাইন্ডিং সরবরাহ করতে একটি নোড.জেএস এক্সটেনশন ব্যবহার করতে পারেন। এখানে একটি টিউটোরিয়াল দেওয়া হয়েছে যা এতে অন্তর্ভুক্ত রয়েছে:

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


11

আপনি এস-স্ক্রিপ্ট ব্যবহার করতে পারেন সি ++ কোডটি জেএসে সংকলন করতে।


16
যদি ওপির লক্ষ্যটি সংকলিত সি ++ এর পারফরম্যান্স সুবিধাগুলি পাওয়া এবং পেডেন্টিক হওয়া এটি প্রশ্নের উত্তর না দেয় তবে এটি একটি খারাপ ধারণা হবে।
গ্রেগ

7
@ গ্রেগ কিন্তু তবুও এটি বিবেচনা করার মতো ধারণা। বিভিন্ন ধরণের প্রকল্পের জন্য লোকেরা এই পৃষ্ঠায় আসে। আমি মনে করি যখন আপনার কাছে সি / সি ++ কোড বেস থাকে এবং কেবল নোডেজে এটি ব্যবহার করতে চান তখন ইমস্প্রিপ্টন একটি ভাল বিকল্প।
অ্যালেক্সস্ট্যাক

1
- যদি ওপির লক্ষ্যটি সংকলিত সি ++ এর পারফরম্যান্স সুবিধাগুলি পাওয়া যায় - কিছু বেনিফিট অনুবাদ করে বিশেষত ডাব্লুএসএম এর সাথে: এমসি ওভারহেড, কম পার্সিং এবং জেআইটি ওভারহেড, নেটিভ ইন্টিজার, এওটি অপ্টিমাইজেশন।
আর্টেমগ্রি

2

নোড.জেএস এবং সি ++ যুক্ত করার আরও নতুন উপায়। দয়া করে, নানকে লুট করুন ।

সম্পাদনা করুন সবচেয়ে দ্রুত এবং সহজতম উপায়টি এনবিন্ড । আপনি যদি অ্যাসিঙ্ক্রোনাস অ্যাড-অন লিখতে চান তবে আপনি Asyncworkerনান থেকে ক্লাস একত্র করতে পারেন ।


1

নোড.জেএস দিয়ে ওয়েবে আপনার সি ++ পাওয়ার বিষয়ে একটি আকর্ষণীয় নিবন্ধ এখানে

নোড.জেএস অ্যাপ্লিকেশনটির সাথে সি ++ কোড একীকরণের তিনটি সাধারণ উপায় - যদিও প্রতিটি বিভাগের মধ্যে প্রচুর প্রকরণ রয়েছে:

  1. অটোমেশন - একটি শিশু প্রক্রিয়াতে আপনার সি ++ কে স্ট্যান্ড্যালোন অ্যাপ হিসাবে কল করুন।
  2. ভাগ করা লাইব্রেরি - আপনার সি ++ রুটিনগুলি একটি ভাগ করা লাইব্রেরিতে (dll) প্যাক করুন এবং সরাসরি নোড.জেএস থেকে সেই রুটিনগুলিতে কল করুন।
  3. নোড.জেএস অ্যাডন - আপনার সি ++ কোড একটি নেটিভ নোড.জেএস মডিউল / অ্যাডন হিসাবে সংকলন করুন।

0

সুইগ এবং সি ++ সহ কার্যকর: http://www.swig.org/Doc1.3/SWIG.html#SWIG_nn8

সি ++ উত্স ফাইলগুলিতে এসডব্লিউআইজি চালানো (কোনটি .C বা .cxx ফাইলে প্রদর্শিত হবে) বাঞ্ছনীয় নয়। যদিও এসডব্লিউআইজি সি ++ শ্রেণির ঘোষণাগুলি পার্স করতে পারে তবে এটি তাদের মূল শ্রেণীর সংজ্ঞা থেকে ডিক্লোল করা ঘোষণাকে উপেক্ষা করে (ঘোষণাগুলি পার্স করা হয়, তবে প্রচুর সতর্কতা বার্তা উত্পন্ন হতে পারে)। উদাহরণ স্বরূপ:

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

এটি কেবলমাত্র একটি। এইচ ফাইলের মধ্যেই সি ++ শ্রেণি সীমাবদ্ধ।

এছাড়াও, জাভাস্ক্রিপ্ট সমর্থনকারী সুইগের সংস্করণগুলি swig-3.0.1 বা তার পরেরটি।


আমি বুঝতে পারি না যে SWIG foo::barযেভাবেই হোক সংজ্ঞা দিয়ে do শ্রেণীর সদস্যের সংজ্ঞা বাস্তবায়ন সম্পর্কে; এসডাব্লুআইজি উত্পন্ন যে মোড়কগুলি সমস্ত ইন্টারফেসের সাথে সম্পর্কিত।
এনোবায়রাম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.