web-dev-qa-db-fra.com

Comment utiliser une bibliothèque C++ à partir de node.js?

Comment utiliser une bibliothèque C++ à partir de node.js?

118
MaiaVictor

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++.

61
Vadim Baryshev

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.

76
enobayram

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

19
Alex

Vous pouvez utiliser emscripten pour compiler le code C++ en js.

10
N3UR0CHR0M

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:

  1. Automatisation - appelez votre C++ en tant qu'application autonome dans un processus enfant.
  2. Bibliothèque partagée: placez vos routines C++ dans une bibliothèque partagée (dll) et appelez ces routines directement à partir de Node.js.
  3. Node.js Addon - compilez votre code C++ en tant que module/addon Node.js natif.
1
sreepurna

Il existe de nouveaux moyens de connecter Node.js et C++. S'il vous plaît, pillez à Nan .

EDIT Le moyen le plus rapide et le plus simple est nbind . Si vous voulez écrire un complément asynchrone, vous pouvez combiner la classe Asyncworker de nan.

1
Jasurbek Nabijonov

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.

0
Anton