Jak mogę używać biblioteki C ++ z node.js?
Jak mogę używać biblioteki C ++ z node.js?
Odpowiedzi:
Spójrz na node-ffi .
node-ffi to dodatek Node.js do ładowania i wywoływania bibliotek dynamicznych przy użyciu czystego JavaScript. Może być używany do tworzenia powiązań z natywnymi bibliotekami bez pisania kodu w C ++.
Teraz jest nowa odpowiedź na to pytanie. Wydaje się, że od wersji 3.0 SWIG zapewnia generatory interfejsów javascript dla Node.js, Webkit i v8.
Od jakiegoś czasu intensywnie używam SWIG dla Javy i Pythona, a kiedy już zrozumiesz, jak działa SWIG, prawie nie ma wysiłku (w porównaniu z ffi lub odpowiednikiem w języku docelowym) potrzebnym do połączenia kodu C ++ z językami, które SWIG obsługuje.
Jako mały przykład załóżmy, że masz bibliotekę z nagłówkiem 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;
}
};
Aby użyć tej klasy w węźle, wystarczy napisać następujący plik interfejsu SWIG (mylib.i):
%module "mylib"
%{
#include "myclass.h"
%}
%include "myclass.h"
Utwórz plik wiązania binding.gyp:
{
"targets": [
{
"target_name": "mylib",
"sources": [ "mylib_wrap.cxx" ]
}
]
}
Uruchom następujące polecenia:
swig -c++ -javascript -node mylib.i
node-gyp build
Teraz, uruchamiając węzeł z tego samego folderu, możesz wykonać:
> var mylib = require("./build/Release/mylib")
> var c = new mylib.MyClass(5)
> c.sayHello()
Hello, my number is:5
Chociaż musieliśmy napisać 2 pliki interfejsów dla tak małego przykładu, zauważ, że nie musieliśmy nigdzie wspominać o MyClass
konstruktorze ani o sayHello
metodzie, SWIG odkrywa te rzeczy i automatycznie generuje naturalne interfejsy.
std::vector<>
na przykład po prostu %include "std_vector.i"
), i będziesz mógł manipulować nią po stronie javascript w nieco niezręczny sposób. Zauważ, że to podejście jest nadal o wiele łatwiejsze i bezpieczniejsze niż samodzielne pisanie FFI.
Możesz użyć rozszerzenia node.js, aby zapewnić powiązania dla swojego kodu C ++. Oto jeden samouczek, który obejmuje to:
http://syskall.com/how-to-write-your-own-native-nodejs-extension
Możesz użyć emscripten do skompilowania kodu C ++ do js.
Oto interesujący artykuł na temat pobierania C ++ do sieci przy użyciu Node.js.
trzy ogólne sposoby integracji kodu C ++ z aplikacją Node.js - chociaż istnieje wiele odmian w ramach każdej kategorii:
- Automatyzacja - wywołaj C ++ jako samodzielną aplikację w procesie potomnym.
- Biblioteka współdzielona - spakuj procedury C ++ do biblioteki współdzielonej (dll) i wywołaj te procedury bezpośrednio z Node.js.
- Node.js Addon - skompiluj swój kod C ++ jako natywny moduł / dodatek Node.js.
Uważaj na swig i C ++: http://www.swig.org/Doc1.3/SWIG.html#SWIG_nn8
Uruchamianie SWIG na plikach źródłowych C ++ (które pojawiłyby się w pliku .C lub .cxx) nie jest zalecane. Chociaż SWIG może analizować deklaracje klas C ++, ignoruje deklaracje, które są oddzielone od ich oryginalnej definicji klasy (deklaracje są analizowane, ale może zostać wygenerowanych wiele komunikatów ostrzegawczych). Na przykład:
/* Not supported by SWIG */ int foo::bar(int) { ... whatever ... }
Rzadko kiedy klasa C ++ jest ograniczona tylko do jednego pliku .h.
Ponadto wersja swig obsługująca JavaScript to swig-3.0.1 lub nowsza.
foo::bar
. Definicja członka klasy dotyczy implementacji; otoki generowane przez SWIG dotyczą interfejsu.
Wypróbuj shelljs, aby wywołać program c / c ++ lub biblioteki współdzielone za pomocą programu węzłowego z linux / unix. node-cmd opcja w systemie Windows. Oba pakiety w zasadzie pozwalają nam wywołać program c / c ++ podobnie do sposobu, w jaki wywołujemy z terminala / wiersza poleceń.
Np. W ubuntu:
const shell = require('shelljs');
shell.exec("command or script name");
W oknach:
const cmd = require('node-cmd');
cmd.run('command here');
Uwaga: shelljs i node-cmd służą do uruchamiania poleceń systemu operacyjnego, a nie specyficznych dla c / c ++.
extension
. Rozszerzenie