Как я могу использовать библиотеку 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"
Создайте файл привязки binding.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
метод, 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
. Расширение