Comment puis-je utiliser une bibliothèque C ++ à partir de node.js?
Comment puis-je utiliser une bibliothèque C ++ à partir de node.js?
Réponses:
Regardez node-ffi .
node-ffi est un addon Node.js pour charger et appeler des bibliothèques dynamiques en utilisant du JavaScript pur. Il peut être utilisé pour créer des liaisons vers des bibliothèques natives sans écrire de code C ++.
Il y a maintenant une nouvelle réponse à cette question. SWIG , à partir de la version 3.0, semble fournir des générateurs d'interface javascript pour Node.js, Webkit et v8.
J'utilise beaucoup SWIG pour Java et Python depuis un certain temps, et une fois que vous comprenez comment fonctionne SWIG, il n'y a presque aucun effort (par rapport à ffi ou l'équivalent dans le langage cible) nécessaire pour interfacer le code C ++ avec les langages SWIG les soutiens.
À titre d'exemple, disons 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 node, 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 le nœud à 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 devions écrire 2 fichiers d'interface pour un si petit exemple, notez que nous n'avons pas eu à mentionner le MyClass
constructeur ni la sayHello
méthode n'importe où, SWIG découvre ces choses et génère automatiquement des interfaces naturelles.
std::vector<>
par exemple, juste %include "std_vector.i"
), et vous serez en mesure de le manipuler côté javascript d'une manière quelque peu maladroite. Notez que cette approche est toujours beaucoup plus facile et plus sûre que d'écrire vous-même FFI.
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 du code C ++ en js.
Voici un article intéressant sur la mise en place de votre C ++ sur le Web avec Node.js
trois façons générales d'intégrer du code C ++ avec une application Node.js - bien qu'il existe de nombreuses variantes dans chaque catégorie:
- Automatisation - appelez votre C ++ en tant qu'application autonome dans un processus enfant.
- Bibliothèque partagée - regroupez vos routines C ++ dans une bibliothèque partagée (dll) et appelez ces routines directement depuis Node.js.
- Addon Node.js - compilez votre code C ++ en tant que module / addon Node.js natif.
Faites attention à 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îtrait 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 qui sont 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 qu'une classe C ++ soit limitée à un seul fichier .h.
De plus, les versions de swig prenant en charge JavaScript sont swig-3.0.1 ou version ultérieure.
foo::bar
toute façon. La définition d'un membre de classe concerne la mise en œuvre; les wrappers générés par SWIG concernent uniquement l'interface.
extension
. Extension