2012-03-09 25 views
112

¿Cómo puedo usar una biblioteca C++ de node.js?¿Cómo puedo usar una biblioteca C++ de node.js?

+8

La palabra clave es 'extensión'. Extensión de Google [C++ nodejs] (https://www.google.co.uk/search?q=c%2B%2B+nodejs+extension) –

+5

Siga este enlace. Ha proporcionado un programa de ejemplo y lo ha explicado paso a paso. http://www.benfarrell.com/2013/01/03/c-and-node-js-an-unholy-combination-but-oh-so-right/ –

Respuesta

56

Mira node-ffi.

nodo-fi es un complemento de Node.js para la carga y llamando a las bibliotecas dinámicas utilizando JavaScript puro. Se puede usar para crear enlaces a bibliotecas nativas sin escribir ningún código C++.

+4

Los diferentes compiladores de C++ crean diferentes ABI, por lo tanto, para usar el nodo -ffi es posible que deba envolver su código C++ con una interfaz C, o al menos lo hice para que funcione en Windows con Visual Studio. Consulte http://stackoverflow.com/questions/2045774/developing-c-wrapper-api-for-object-oriented-c-code para obtener detalles sobre cómo hacer esto. ¿O debería ser capaz de usar node-ffi en C++ sin un contenedor? – pancake

+0

Sé que hace más de un año que se comentan, pero ... ¿es posible usar librerías C++ sin envoltorio C? –

+5

* chirp chirp * Cualquier actualización sobre esta pregunta^ –

10

Puede usar emscripten para compilar el código de C++ en js.

+15

Esto sería una mala idea si el objetivo de OP es obtener los beneficios de rendimiento de C++ compilado, y para ser pedante no responde la pregunta. – Greg

+6

@Greg pero aún así es una idea que vale la pena considerar. La gente viene a esta página para varios tipos de proyectos en la mano. Creo que Emscripten es una buena opción cuando tienes la base de código C/C++ y solo quieres usarla en Nodejs. – AlexStack

71

Ahora hay una nueva respuesta a esa pregunta. SWIG, a partir de la versión 3.0 parece proporcionar javascript interface generators para Node.js, Webkit y v8.

He estado usando SWIG extensamente para Java y Python por un tiempo, y una vez que entienda cómo funciona SWIG, no hay casi ningún esfuerzo (comparado con ffi o el equivalente en el idioma de destino) necesario para conectar el código C++ a los idiomas que SWIG soporta.

Como un pequeño ejemplo, supongamos que tiene una biblioteca con el MyClass.h cabecera:

#include<iostream> 

class MyClass { 
     int myNumber; 
public: 
     MyClass(int number): myNumber(number){} 
     void sayHello() { 
       std::cout << "Hello, my number is:" 
       << myNumber <<std::endl; 
     } 
}; 

Para utilizar esta clase en el nodo, sólo tiene que escribir el siguiente archivo de interfaz SWIG (mylib.i) :

%module "mylib" 
%{ 
#include "myclass.h" 
%} 
%include "myclass.h" 

Cree el archivo de enlace binding.gyp:

{ 
    "targets": [ 
    { 
     "target_name": "mylib", 
     "sources": [ "mylib_wrap.cxx" ] 
    } 
    ] 
} 

Ejecutar el siguiente comman DS:

swig -c++ -javascript -node mylib.i 
node-gyp build 

Ahora, corriendo nodo de la misma carpeta, puede hacer:

> var mylib = require("./build/Release/mylib") 
> var c = new mylib.MyClass(5) 
> c.sayHello() 
Hello, my number is:5 

A pesar de que teníamos que escribir 2 archivos de interfaz para un pequeño ejemplo, ano- cómo no lo hicimos tiene que mencionar el constructor MyClass ni el método sayHello en ninguna parte, SWIG lo descubre y genera automáticamente interfaces naturales.

+0

¡Esto se ve increíblemente simple! Gracias por el ejemplo trabajado –

+0

Esta respuesta me presentó a swig, que es increíble. ¡Automatiza todo el código repetitivo del complemento! Esto es demasiado bueno para ser verdad. ¿Hay algún tipo de compromiso de rendimiento masivo en juego aquí? – George

+1

Después de jugar con swig/node.js por un momento, parece que swig no puede manejar las funciones de C++ que devuelven las matrices (más precisamente: funciones que devuelven los punteros a las matrices). Es decir, parece que no se puede construir una función en C++ que devuelva algo así como una matriz de JavaScript y que Swim la convierta automáticamente. – George

0

Becareful con trago y C++: http://www.swig.org/Doc1.3/SWIG.html#SWIG_nn8

Correr TRAGO en los archivos fuente de C++ (lo que aparecería en un archivo .C o .cxx) no es recomendable. Aunque SWIG puede analizar declaraciones de clases de C++, ignora las declaraciones que están desacopladas de su definición de clase original (las declaraciones se analizan, pero se pueden generar muchos mensajes de advertencia). Por ejemplo:

/* Not supported by SWIG */ 
int foo::bar(int) { 
    ... whatever ... 
} 

rara vez es tener una clase de C++ limitada a un solo archivo .h.

Además, las versiones de swig que admiten JavaScript son swig-3.0.1 o posterior.

+0

No entiendo lo que haría SWIG con la definición de 'foo :: bar' de todas formas. La definición de un miembro de la clase tiene que ver con la implementación; las envolturas que genera SWIG tienen que ver con la interfaz. – enobayram

1

Existen nuevas formas de conectar Node.js y C++. Por favor, saquear al Nan.

EDIT La manera más rápida y fácil es nbind. Si desea escribir un complemento asíncrono, puede combinar la clase Asyncworker de nan.

Cuestiones relacionadas