Come posso usare una libreria C ++ da node.js?
Come posso usare una libreria C ++ da node.js?
Risposte:
Guarda node-ffi .
node-ffi è un addon Node.js per caricare e chiamare librerie dinamiche usando JavaScript puro. Può essere utilizzato per creare collegamenti a librerie native senza scrivere alcun codice C ++.
C'è una nuova risposta a questa domanda ora. SWIG , dalla versione 3.0 sembra fornire generatori di interfaccia javascript per Node.js, Webkit e v8.
Ho usato SWIG ampiamente per Java e Python per un po ', e una volta capito come funziona SWIG, non c'è quasi nessuno sforzo (rispetto a ffi o l'equivalente nella lingua di destinazione) necessario per interfacciare il codice C ++ con le lingue che SWIG supporti.
Ad esempio, supponiamo di avere una libreria con l'intestazione 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;
}
};
Per utilizzare questa classe nel nodo, è sufficiente scrivere il seguente file di interfaccia SWIG (mylib.i):
%module "mylib"
%{
#include "myclass.h"
%}
%include "myclass.h"
Creare il file di associazione binding.gyp:
{
"targets": [
{
"target_name": "mylib",
"sources": [ "mylib_wrap.cxx" ]
}
]
}
Esegui i seguenti comandi:
swig -c++ -javascript -node mylib.i
node-gyp build
Ora, eseguendo il nodo dalla stessa cartella, puoi fare:
> var mylib = require("./build/Release/mylib")
> var c = new mylib.MyClass(5)
> c.sayHello()
Hello, my number is:5
Anche se abbiamo bisogno di scrivere 2 file di interfaccia per un esempio così piccolo, notare come non abbiamo dovuto menzionare il MyClass
costruttore né il sayHello
metodo da nessuna parte, SWIG scopre queste cose e genera automaticamente interfacce naturali.
std::vector<>
per esempio, solo %include "std_vector.i"
) e sarai in grado di manipolarlo sul lato javascript in un modo un po 'strano. Si noti che questo approccio è ancora molto più semplice e sicuro rispetto alla scrittura di FFI da soli.
È possibile utilizzare un'estensione node.js per fornire collegamenti per il codice C ++. Ecco un tutorial che copre questo:
http://syskall.com/how-to-write-your-own-native-nodejs-extension
È possibile utilizzare emscripten per compilare il codice C ++ in js.
Ecco un interessante articolo su Come portare il tuo C ++ sul Web con Node.js
tre modi generali per integrare il codice C ++ con un'applicazione Node.js, sebbene ci siano molte varianti all'interno di ciascuna categoria:
- Automazione: chiama il tuo C ++ come app autonoma in un processo figlio.
- Libreria condivisa: impacchettare le routine C ++ in una libreria condivisa (dll) e chiamare direttamente tali routine da Node.js.
- Componente aggiuntivo Node.js: compila il codice C ++ come modulo / componente aggiuntivo Node.js nativo.
Diventato con swig e C ++: http://www.swig.org/Doc1.3/SWIG.html#SWIG_nn8
Non è consigliabile eseguire SWIG su file sorgente C ++ (ciò che apparirebbe in un file .C o .cxx). Anche se SWIG può analizzare le dichiarazioni di classe C ++, ignora le dichiarazioni che sono disaccoppiate dalla loro definizione di classe originale (le dichiarazioni vengono analizzate, ma possono essere generati molti messaggi di avviso). Per esempio:
/* Not supported by SWIG */ int foo::bar(int) { ... whatever ... }
Raramente è necessario avere una classe C ++ limitata a un solo file .h.
Inoltre, le versioni di swig che supportano JavaScript sono swig-3.0.1 o successive.
foo::bar
. La definizione di un membro della classe riguarda l'implementazione; i wrapper generati da SWIG riguardano l'intera interfaccia.
extension
. Google C ++ nodejs estensione