Как я могу использовать библиотеку С++ из node.js?
Как я могу использовать библиотеку С++ из node.js?
Ответ 1
Посмотрите node-ffi.
node -ffi - это аддон Node.js для загрузки и вызова динамических библиотек с использованием чистого JavaScript. Его можно использовать для создания привязок к родным библиотекам без написания кода на С++.
Ответ 2
Теперь есть новый ответ на этот вопрос. SWIG, с версии 3.0, как представляется, генераторы интерфейса javascript для Node.js, Webkit и v8.
Я использую SWIG для Java и Python некоторое время, и как только вы понимаете, как работает SWIG, почти нет усилий (по сравнению с ffi или эквивалентом на целевом языке), необходимых для взаимодействия кода на С++ с языки, которые поддерживает 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;
}
};
Чтобы использовать этот класс в node, вы просто пишете следующий файл интерфейса SWIG (mylib.i):
%module "mylib"
%{
#include "myclass.h"
%}
%include "myclass.h"
Создайте файл привязки binding.gyp:
{
"targets": [
{
"target_name": "mylib",
"sources": [ "mylib_wrap.cxx" ]
}
]
}
Выполните следующие команды:
swig -c++ -javascript -node mylib.i
node-gyp build
Теперь, запустив node из той же папки, вы можете сделать:
> var mylib = require("./build/Release/mylib")
> var c = new mylib.MyClass(5)
> c.sayHello()
Hello, my number is:5
Несмотря на то, что нам нужно было написать два файла интерфейса для такого небольшого примера, обратите внимание на то, что нам не нужно упоминать конструктор MyClass
или метод sayHello
в любом месте, SWIG обнаруживает эти вещи и автоматически генерирует естественные интерфейсы.
Ответ 3
Вы можете использовать расширение node.js для предоставления привязок для вашего кода на С++. Вот один учебник, который охватывает это:
http://syskall.com/how-to-write-your-own-native-nodejs-extension
Ответ 4
Вы можете использовать emscripten для компиляции кода на С++ в js.
Ответ 5
Появились новые способы подключения Node.js и С++. Пожалуйста, loot at Nan.
ИЗМЕНИТЬ
Самый быстрый и простой способ - nbind. Если вы хотите написать асинхронное дополнение, вы можете комбинировать класс Asyncworker
от nan.
Ответ 6
Вот интересная статья о том, как получить ваш C++ в Интернете с помощью Node.js
три общих способа интеграции кода C++ с приложением Node.js - хотя в каждой категории существует множество вариаций:
- Автоматизация - вызовите C++ в качестве автономного приложения в дочернем процессе.
- Общая библиотека - упакуйте подпрограммы C++ в общей библиотеке (dll) и вызовите эти процедуры из Node.js напрямую.
- Node.js Addon - скомпилируйте ваш C++ код как родной модуль/аддон Node.js.
Ответ 7
Будьте осторожны с swig и С++: http://www.swig.org/Doc1.3/SWIG.html#SWIG_nn8
Запуск SWIG в исходных файлах на С++ (что бы появлялось в файле .C или .cxx) не рекомендуется. Несмотря на то, что SWIG может анализировать объявления класса С++, он игнорирует объявления, которые отделяются от их первоначального определения класса (объявления анализируются, но может генерироваться много предупреждающих сообщений). Например:
/* Not supported by SWIG */ int foo::bar(int) { ... whatever ... }
Редко, чтобы класс С++ ограничивался только одним файлом .h.
Кроме того, версии swig, поддерживающие JavaScript, являются swig-3.0.1 или новее.