Wie kann ich eine C ++ - Bibliothek aus node.js verwenden?
Wie kann ich eine C ++ - Bibliothek aus node.js verwenden?
Antworten:
Schauen Sie sich node-ffi an .
node-ffi ist ein Node.js-Addon zum Laden und Aufrufen dynamischer Bibliotheken mit reinem JavaScript. Es kann verwendet werden, um Bindungen an native Bibliotheken zu erstellen, ohne C ++ - Code zu schreiben.
Auf diese Frage gibt es jetzt eine neue Antwort. SWIG scheint ab Version 3.0 Javascript-Schnittstellengeneratoren für Node.js, Webkit und v8 bereitzustellen.
Ich habe SWIG für eine Weile ausgiebig für Java und Python verwendet, und wenn Sie erst einmal verstanden haben, wie SWIG funktioniert, sind fast keine Anstrengungen (im Vergleich zu ffi oder dem Äquivalent in der Zielsprache) erforderlich, um C ++ - Code mit den Sprachen von SWIG zu verbinden unterstützt.
Angenommen, Sie haben eine Bibliothek mit dem Header 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;
}
};
Um diese Klasse im Knoten zu verwenden, schreiben Sie einfach die folgende SWIG-Schnittstellendatei (mylib.i):
%module "mylib"
%{
#include "myclass.h"
%}
%include "myclass.h"
Erstellen Sie die Bindungsdatei binding.gyp:
{
"targets": [
{
"target_name": "mylib",
"sources": [ "mylib_wrap.cxx" ]
}
]
}
Führen Sie die folgenden Befehle aus:
swig -c++ -javascript -node mylib.i
node-gyp build
Wenn Sie nun den Knoten aus demselben Ordner ausführen, können Sie Folgendes tun:
> var mylib = require("./build/Release/mylib")
> var c = new mylib.MyClass(5)
> c.sayHello()
Hello, my number is:5
Obwohl wir für ein so kleines Beispiel zwei Schnittstellendateien schreiben mussten, beachten Sie, dass wir weder den MyClass
Konstruktor noch die sayHello
Methode irgendwo erwähnen mussten. SWIG entdeckt diese Dinge und generiert automatisch natürliche Schnittstellen.
std::vector<>
z. B. nur %include "std_vector.i"
), und Sie können es auf der Javascript-Seite auf etwas umständliche Weise bearbeiten. Beachten Sie, dass dieser Ansatz immer noch viel einfacher und sicherer ist als das Schreiben von FFI selbst.
Sie können eine node.js-Erweiterung verwenden, um Bindungen für Ihren C ++ - Code bereitzustellen. Hier ist ein Tutorial, das das behandelt:
http://syskall.com/how-to-write-your-own-native-nodejs-extension
Sie können emscripten verwenden , um C ++ - Code in js zu kompilieren.
Hier ist ein interessanter Artikel darüber, wie Sie Ihr C ++ mit Node.js ins Web bringen können
Drei allgemeine Möglichkeiten zur Integration von C ++ - Code in eine Node.js-Anwendung - obwohl es in jeder Kategorie viele Variationen gibt:
- Automatisierung - Rufen Sie Ihr C ++ als eigenständige App in einem untergeordneten Prozess auf.
- Gemeinsame Bibliothek - Packen Sie Ihre C ++ - Routinen in eine gemeinsam genutzte Bibliothek (DLL) und rufen Sie diese Routinen direkt von Node.js aus auf.
- Node.js Addon - Kompilieren Sie Ihren C ++ - Code als natives Node.js-Modul / Addon.
Seien Sie vorsichtig mit swig und C ++: http://www.swig.org/Doc1.3/SWIG.html#SWIG_nn8
Das Ausführen von SWIG in C ++ - Quelldateien (was in einer C- oder CXX-Datei angezeigt wird) wird nicht empfohlen. Obwohl SWIG C ++ - Klassendeklarationen analysieren kann, werden Deklarationen ignoriert, die von ihrer ursprünglichen Klassendefinition entkoppelt sind (die Deklarationen werden analysiert, es können jedoch viele Warnmeldungen generiert werden). Beispielsweise:
/* Not supported by SWIG */ int foo::bar(int) { ... whatever ... }
Es ist selten, dass eine C ++ - Klasse auf nur eine .h-Datei beschränkt ist.
Die Versionen von swig, die JavaScript unterstützen, sind swig-3.0.1 oder höher.
foo::bar
sowieso machen würde. Bei der Definition eines Klassenmitglieds dreht sich alles um die Implementierung. Bei den von SWIG generierten Wrappern dreht sich alles um die Schnittstelle.
extension
. Google c ++ nodejs Erweiterung