¿Cómo puedo usar una biblioteca C ++ de node.js?
¿Cómo puedo usar una biblioteca C ++ de node.js?
Respuestas:
Mira nodo-ffi .
node-ffi es un complemento de Node.js para cargar y llamar bibliotecas dinámicas usando JavaScript puro. Se puede usar para crear enlaces a bibliotecas nativas sin escribir ningún código C ++.
Hay una nueva respuesta a esa pregunta ahora. SWIG , a partir de la versión 3.0 parece proporcionar generadores de interfaz javascript para Node.js, Webkit y v8.
He estado usando SWIG ampliamente para Java y Python durante un tiempo, y una vez que entiendes cómo funciona SWIG, casi no hay esfuerzo (en comparación con ffi o el equivalente en el idioma de destino) necesario para conectar el código C ++ a los idiomas que SWIG Soportes.
Como un pequeño ejemplo, supongamos que tiene una biblioteca con el encabezado 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;
}
};
Para utilizar esta clase en el nodo, simplemente escriba el siguiente archivo de interfaz SWIG (mylib.i):
%module "mylib"
%{
#include "myclass.h"
%}
%include "myclass.h"
Cree el archivo de enlace vinculante.gyp:
{
"targets": [
{
"target_name": "mylib",
"sources": [ "mylib_wrap.cxx" ]
}
]
}
Ejecute los siguientes comandos:
swig -c++ -javascript -node mylib.i
node-gyp build
Ahora, ejecutando el nodo desde la misma carpeta, puede hacer:
> var mylib = require("./build/Release/mylib")
> var c = new mylib.MyClass(5)
> c.sayHello()
Hello, my number is:5
Aunque necesitábamos escribir 2 archivos de interfaz para un ejemplo tan pequeño, tenga en cuenta que no tuvimos que mencionar el MyClass
constructor ni el sayHello
método en ninguna parte, SWIG descubre estas cosas y genera automáticamente interfaces naturales.
std::vector<>
por ejemplo, solo %include "std_vector.i"
), y podrá manipularlo en el lado de JavaScript de una manera algo incómoda. Tenga en cuenta que este enfoque sigue siendo mucho más fácil y seguro que escribir FFI usted mismo.
Puede usar una extensión node.js para proporcionar enlaces para su código C ++. Aquí hay un tutorial que cubre eso:
http://syskall.com/how-to-write-your-own-native-nodejs-extension
Puede usar emscripten para compilar código C ++ en js.
Aquí hay un artículo interesante sobre cómo llevar su C ++ a la web con Node.js
Tres formas generales de integrar código C ++ con una aplicación Node.js, aunque hay muchas variaciones dentro de cada categoría:
- Automatización: llame a su C ++ como una aplicación independiente en un proceso secundario.
- Biblioteca compartida: empaquete sus rutinas C ++ en una biblioteca compartida (dll) y llame a esas rutinas desde Node.js directamente.
- Complemento Node.js: compile su código C ++ como un módulo / complemento Node.js nativo.
Con éxito con swig y C ++: http://www.swig.org/Doc1.3/SWIG.html#SWIG_nn8
No se recomienda ejecutar SWIG en archivos fuente C ++ (lo que aparecería en un archivo .C o .cxx). Aunque SWIG puede analizar las declaraciones de clase 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 se tiene una clase C ++ limitada a un solo archivo .h.
Además, las versiones de swig que admiten JavaScript son swig-3.0.1 o posterior.
foo::bar
todos modos. La definición de un miembro de la clase tiene que ver con la implementación; Los contenedores que genera SWIG tienen que ver con la interfaz.
extension
. Extensión