Comment utiliser une bibliothèque C++ à partir de node.js?
Regardez node-ffi .
node-ffi est un addon Node.js pour le chargement et l'appel de bibliothèques dynamiques à l'aide de JavaScript pur. Il peut être utilisé pour créer des liaisons avec des bibliothèques natives sans écrire de code C++.
Il y a une nouvelle réponse à cette question maintenant. SWIG , à partir de la version 3.0 semble fournir des générateurs d'interface javascript pour Node.js, Webkit et v8.
J'utilise abondamment SWIG pour Java et Python depuis un moment. Une fois que vous avez compris comment fonctionne SWIG, vous ne devez pratiquement pas faire d'effort (comparé à ffi ou à l'équivalent dans le langage cible) pour interfacer le code C++ avec les langages que SWIG les soutiens.
Par exemple, supposons que vous avez une bibliothèque avec l'en-tête 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;
}
};
Pour utiliser cette classe dans le noeud, vous écrivez simplement le fichier d'interface SWIG suivant (mylib.i):
%module "mylib"
%{
#include "myclass.h"
%}
%include "myclass.h"
Créez le fichier de liaison binding.gyp:
{
"targets": [
{
"target_name": "mylib",
"sources": [ "mylib_wrap.cxx" ]
}
]
}
Exécutez les commandes suivantes:
swig -c++ -javascript -node mylib.i
node-gyp build
Maintenant, en exécutant noeud à partir du même dossier, vous pouvez faire:
> var mylib = require("./build/Release/mylib")
> var c = new mylib.MyClass(5)
> c.sayHello()
Hello, my number is:5
Même si nous avions besoin d'écrire 2 fichiers d'interface pour un si petit exemple, notez que nous n'avions pas à mentionner le constructeur MyClass
ni la méthode sayHello
, SWIG découvre ces choses et génère automatiquement des interfaces naturelles.
Vous pouvez utiliser une extension node.js pour fournir des liaisons pour votre code C++. Voici un tutoriel qui couvre cela:
http://syskall.com/how-to-write-your-own-native-nodejs-extension
Vous pouvez utiliser emscripten pour compiler le code C++ en js.
Voici un article intéressant sur Obtenir votre C++ sur le Web avec Node.js
trois manières générales d’intégrer du code C++ à une application Node.js - bien qu'il y ait beaucoup de variations dans chaque catégorie:
- Automatisation - appelez votre C++ en tant qu'application autonome dans un processus enfant.
- Bibliothèque partagée: placez vos routines C++ dans une bibliothèque partagée (dll) et appelez ces routines directement à partir de Node.js.
- Node.js Addon - compilez votre code C++ en tant que module/addon Node.js natif.
Attention avec swig et C++: http://www.swig.org/Doc1.3/SWIG.html#SWIG_nn8
L'exécution de SWIG sur des fichiers source C++ (ce qui apparaît dans un fichier .C ou .cxx) n'est pas recommandée. Même si SWIG peut analyser les déclarations de classe C++, il ignore les déclarations découplées de leur définition de classe d'origine (les déclarations sont analysées, mais de nombreux messages d'avertissement peuvent être générés). Par exemple:
/* Not supported by SWIG */ int foo::bar(int) { ... whatever ... }
Il est rare d'avoir une classe C++ limitée à un seul fichier .h.
En outre, les versions de swig prenant en charge JavaScript sont swig-3.0.1 ou une version ultérieure.