如何使用node.js中的C++库

How can I use a C++ library from node.js?

本文关键字:C++ 中的 js 何使用 node      更新时间:2023-10-16

如何使用node.js中的C++库?

现在这个问题有了新的答案。SWIG,从3.0版本开始,似乎为Node.js、Webkit和v8提供了javascript接口生成器。

一段时间以来,我一直在Java和Python中广泛使用SWIG,一旦您了解了SWIG的工作原理,就几乎不需要付出任何努力(与目标语言中的ffi或等效语言相比)将C++代码与SWIG支持的语言进行接口连接。

举个小例子,假设您有一个标题为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;
        }
};

为了在节点中使用这个类,您只需编写以下SWIG接口文件(mylib.i):

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

创建绑定文件binding.gyp:

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

运行以下命令:

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

现在,从同一个文件夹运行节点,您可以执行以下操作:

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

尽管我们需要为这样一个小示例编写2个接口文件,但请注意,我们在任何地方都不必提及MyClass构造函数或sayHello方法,SWIG发现了这些东西,并自动生成自然接口。

查看节点ffi。

node-ffi是一个node.js插件,用于使用纯JavaScript加载和调用动态库。它可以用于创建到本机库的绑定,而无需编写任何C++代码。

您可以使用emscripten将C++代码编译成js。

有新的连接Node.js和C++的方法。求你了,在楠那里抢劫。

编辑最快最简单的方法是nbind。如果你想写异步插件,你可以结合nan的Asyncworker类。

这是一篇关于使用Node.js 将C++移植到Web的有趣文章

将C++代码与Node.js应用程序集成的三种通用方法-尽管每个类别中都有很多变化:

  1. 自动化-将您的C++作为子进程中的独立应用程序调用
  2. 共享库-将C++例程打包到共享库(dll)中,并直接从Node.js调用这些例程
  3. Node.js插件-将C++代码编译为本地Node.js模块/插件

尝试使用linux/unix中的节点程序来调用c/c++程序或共享库。nodecmd窗口中的一个选项。这两个包基本上都使我们能够调用c/c++程序,类似于我们从终端/命令行调用的方式。

例如在ubuntu:

const shell = require('shelljs');
shell.exec("command or script name");

在窗口中:

const cmd = require('node-cmd');
cmd.run('command here');

注意:shelljs和nodecmd用于运行os命令,而不是特定于c/c++。

精通swig和C++:http://www.swig.org/Doc1.3/SWIG.html#SWIG_nn8

不建议在C++源文件(出现在.C或.cxx文件中的文件)上运行SWIG。尽管SWIG可以解析C++类声明,但它会忽略与原始类定义解耦的声明(声明会被解析,但可能会生成大量警告消息)。例如:

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

很少有C++类只限于一个.h文件。

此外,支持JavaScript的swig版本为swig-3.0.1或更高版本。