Como posso usar uma biblioteca C ++ no node.js?
Como posso usar uma biblioteca C ++ no node.js?
Respostas:
Veja o node-ffi .
node-ffi é um complemento do Node.js. para carregar e chamar bibliotecas dinâmicas usando JavaScript puro. Ele pode ser usado para criar ligações para bibliotecas nativas sem escrever nenhum código C ++.
Há uma nova resposta para essa pergunta agora. SWIG , a partir da versão 3.0, parece fornecer geradores de interface javascript para Node.js, Webkit e v8.
Eu uso o SWIG extensivamente para Java e Python há algum tempo e, depois de entender como o SWIG funciona, quase não há esforço (comparado ao ffi ou o equivalente na linguagem de destino) necessário para fazer a interface do código C ++ com as linguagens que o SWIG apoia.
Como um pequeno exemplo, digamos que você tenha uma biblioteca com o cabeçalho 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 usar esta classe no nó, basta escrever o seguinte arquivo de interface SWIG (mylib.i):
%module "mylib"
%{
#include "myclass.h"
%}
%include "myclass.h"
Crie o arquivo de ligação binding.gyp:
{
"targets": [
{
"target_name": "mylib",
"sources": [ "mylib_wrap.cxx" ]
}
]
}
Execute os seguintes comandos:
swig -c++ -javascript -node mylib.i
node-gyp build
Agora, executando o nó da mesma pasta, você pode:
> var mylib = require("./build/Release/mylib")
> var c = new mylib.MyClass(5)
> c.sayHello()
Hello, my number is:5
Embora precisássemos escrever 2 arquivos de interface para um exemplo tão pequeno, observe como não precisamos mencionar o MyClass
construtor nem o sayHello
método em nenhum lugar, o SWIG descobre essas coisas e gera automaticamente interfaces naturais.
std::vector<>
por exemplo, apenas %include "std_vector.i"
), e você poderá manipulá-la no lado do javascript de uma maneira um tanto estranha. Observe que essa abordagem ainda é muito mais fácil e segura do que você mesmo escrever a FFI.
Você pode usar uma extensão node.js para fornecer ligações para o seu código C ++. Aqui está um tutorial que aborda isso:
http://syskall.com/how-to-write-your-own-native-nodejs-extension
Você pode usar o emscripten para compilar o código C ++ em js.
Aqui está um artigo interessante sobre como obter seu C ++ na Web com o Node.js
três maneiras gerais de integrar o código C ++ com um aplicativo Node.js. - embora haja muitas variações dentro de cada categoria:
- Automação - chame seu C ++ como um aplicativo independente em um processo filho.
- Biblioteca compartilhada - empacote suas rotinas C ++ em uma biblioteca compartilhada (dll) e chame essas rotinas diretamente do Node.js.
- Node.js Addon - compile seu código C ++ como um módulo / addon nativo do Node.js.
Cuidado com swig e C ++: http://www.swig.org/Doc1.3/SWIG.html#SWIG_nn8
A execução de SWIG em arquivos de origem C ++ (o que apareceria em um arquivo .C ou .cxx) não é recomendada. Embora o SWIG possa analisar declarações de classe C ++, ele ignora as declarações dissociadas de sua definição de classe original (as declarações são analisadas, mas muitas mensagens de aviso podem ser geradas). Por exemplo:
/* Not supported by SWIG */ int foo::bar(int) { ... whatever ... }
É raro ter uma classe C ++ limitada a apenas um arquivo .h.
Além disso, as versões do swig que suportam JavaScript são swig-3.0.1 ou posterior.
foo::bar
qualquer maneira. A definição de um membro da classe tem tudo a ver com implementação; os wrappers que o SWIG gera são todos sobre a interface.
extension
. Google c ++ NodeJS extensão