Jak mogę używać biblioteki C ++ z node.js?
javascript
c++
node.js
binding
MaiaVictor
źródło
źródło
extension
. RozszerzenieOdpowiedzi:
Spójrz na node-ffi .
źródło
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 osayHello
metodzie, SWIG odkrywa te rzeczy i automatycznie generuje naturalne interfejsy.źródło
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
źródło
Możesz użyć emscripten do skompilowania kodu C ++ do js.
źródło
Istnieją nowsze sposoby łączenia Node.js i C ++. Proszę, okradnij Nan .
EDYCJA Najszybszym i najłatwiejszym sposobem jest nbind . Jeśli chcesz napisać dodatek asynchroniczny, możesz połączyć
Asyncworker
klasy z nan.źródło
Oto interesujący artykuł na temat pobierania C ++ do sieci przy użyciu Node.js.
źródło
Uważaj na swig i C ++: http://www.swig.org/Doc1.3/SWIG.html#SWIG_nn8
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.
źródło
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 ++.
źródło