Як я можу використовувати бібліотеку C ++ від node.js?
Як я можу використовувати бібліотеку C ++ від node.js?
Відповіді:
Подивіться на node-ffi .
node-ffi - добавка Node.js для завантаження та виклику динамічних бібліотек за допомогою чистого JavaScript. З його допомогою можна створити прив’язки до рідних бібліотек без написання коду C ++.
Зараз є свіжа відповідь на це питання. SWIG , як видається , у версії 3.0 надає генератори інтерфейсів javascript для Node.js, Webkit та v8.
Я деякий час широко використовував SWIG для Java та Python, і як тільки ви зрозумієте, як працює SWIG, майже ніяких зусиль (порівняно з ffi або його еквівалентом на цільовій мові) майже немає, необхідних для взаємодії коду C ++ з мовами 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"
Створіть файл прив'язки.gіp:
{
"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
Незважаючи на те, що нам потрібно було написати два інтерфейсні файли для такого невеликого прикладу, зауважте, як нам не довелося ніде згадувати MyClass
конструктор чи sayHello
метод, SWIG виявляє ці речі та автоматично генерує природні інтерфейси.
std::vector<>
наприклад, просто %include "std_vector.i"
), і ви зможете маніпулювати ним на стороні javascript дещо незграбно. Зауважте, що такий підхід як і раніше набагато простіший і безпечніший, ніж писати самі FFI.
Ви можете використовувати розширення node.js, щоб забезпечити прив'язку для свого коду C ++. Ось один підручник, який охоплює:
http://syskall.com/how-to-write-your-own-native-nodejs-extension
Ви можете використовувати emscripten для компіляції коду C ++ у js.
Ось цікава стаття про те, як додати свій C ++ до Інтернету за допомогою Node.js
три загальні способи інтеграції коду C ++ з додатком 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
Запуск SWIG у вихідних файлах C ++ (що відображатиметься у файлі .C або .cxx) не рекомендується. Навіть незважаючи на те, що SWIG може аналізувати декларації класу C ++, він ігнорує декларації, які відокремлюються від їх початкового визначення класу (декларації аналізуються, але може бути створено багато попереджувальних повідомлень). Наприклад:
/* Not supported by SWIG */ int foo::bar(int) { ... whatever ... }
Рідко є клас C ++, обмежений лише одним .h-файлом.
Також версії swig, що підтримують JavaScript, є swig-3.0.1 або новіші.
foo::bar
будь-якому випадку. Визначення члена класу - все про реалізацію; обгортки, які створюють SWIG, стосуються інтерфейсу.
extension
. Розширення nodejs