Manchmal möchten Sie mit C ++ - Funktionen und Klassen von Node.js arbeiten. Zum Beispiel, wenn Sie eine GUI mit Code schreiben möchten, der in C ++ in Electron oder Nw.js geschrieben wurde.
Im Allgemeinen scheint es, dass Node-ffi verwendet wird, wenn C ++ - Code von Node aufgerufen wird. Wenn ich jedoch das Tutorial lese, ist es mühsam, etwas zu schreiben.
SWIG ist als Tool zum Erstellen von Bindungen bekannt, das C / C ++ - Funktionen von Python oder Ruby aus aufruft. Tatsächlich können Sie mit diesem SWIG problemlos einen Javascript-Wrapper schreiben.
Die stabile Version von SWIG ist 3.0.12, dies ist jedoch nicht mit Knoten 7 oder höher kompatibel. Verwenden Sie die Entwicklungsversion von Github. Beachten Sie, dass Node-gyp erforderlich ist, um die Bibliothek zu erstellen. Wenn nicht, installieren Sie sie ab npm.
wget https://github.com/swig/swig/archive/master.zip
unzip master.zip
cd swig-master
./autogen.sh
./configure
make
sudo make install
Lesen Sie zum Üben den folgenden Code vom Knoten.
complex.hpp:
#include <string>
struct complex
{
complex(double r=0,double i=0);
double re;
double im;
double abs()const;
std::string to_str()const;
};
complex.cpp:
#include <cmath>
#include "complex.hpp"
complex::complex(double r,double i): re(r), im(i) {}
double complex::abs()const{ return std::sqrt(re*re+im*im); }
std::string complex::to_str()const{ return std::to_string(re)+"+"+std::to_string(im)+"i"; }
Zum Beispiel wäre es schön, wenn dieser Code von der JS unten aufgerufen werden könnte.
complex.js:
const Complex=require('./complex.node').complex;
let z=new Complex();
console.log (z.abs ()); // Ich möchte, dass Sie 0 anzeigen z.re=3; z.im=4; console.log (z.abs ()); // Ich möchte, dass Sie 5 anzeigen Erwarten Sie eine Anzeige wie console.log (z.to_str ()); // 3 + 4i
Mit SWIG müssen Sie nur so viele Trompeten schreiben.
complex.i:
% Modulkomplex // Definieren Sie ein Modul, das von außen sichtbar ist %{ #include "complex.hpp" // Funktionen in diesem sind von außen sichtbar %}
% include "std_string.i" // Wickle std :: string in JS-String, genau wie beim Schreiben %include "complex.hpp"
Sie müssen lediglich binding.gyp für den Build schreiben und SWIG zum Erstellen ausführen.
binding.gyp:
{ "targets": [ {
"target_name": "complex",
"sources": [ "complex.cpp", "complex_wrap.cxx" ]
} ] }
Lauf.
swig -javascript -node -c++ complex.i
node-gyp configure build
Verschieben Sie den erstellten complex.node an einen geeigneten Ort und führen Sie node complex.js
aus ...
0
5
3.000000+4.000000i
Einfach!