Javascript 如何使用C++;来自node.js的库? 如何使用节点No.js?< /p>

Javascript 如何使用C++;来自node.js的库? 如何使用节点No.js?< /p>,javascript,c++,node.js,binding,Javascript,C++,Node.js,Binding,中的C++库。可以使用No.js扩展来为C++代码提供绑定。以下是一个教程,介绍了以下内容: 看看 node ffi是一个node.js插件,用于使用纯JavaScript加载和调用动态库。它可以用来创建绑定到本地库而不编写任何C++代码。 可以编译C++代码到js.< /p> ,现在对这个问题有了一个新的答案。从3.0版开始,似乎提供了Node.js、Webkit和v8 我一直在广泛使用Java和Python的SWIG,一旦了解SWIG的工作原理,就不必费力地将C++代码连接到Sigg支持的语

中的C++库。可以使用No.js扩展来为C++代码提供绑定。以下是一个教程,介绍了以下内容:

看看

node ffi是一个node.js插件,用于使用纯JavaScript加载和调用动态库。它可以用来创建绑定到本地库而不编写任何C++代码。
可以编译C++代码到js.< /p> ,现在对这个问题有了一个新的答案。从3.0版开始,似乎提供了Node.js、Webkit和v8

我一直在广泛使用Java和Python的SWIG,一旦了解SWIG的工作原理,就不必费力地将C++代码连接到Sigg支持的语言中(相比于FFI或java语言中的等效语言)。 举个小例子,假设您有一个标题为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;
        }
};
创建绑定文件binding.gyp:

{
  "targets": [
    {
      "target_name": "mylib",
      "sources": [ "mylib_wrap.cxx" ]
    }
  ]
}
运行以下命令:

swig -c++ -javascript -node mylib.i
node-gyp build
现在,从同一文件夹运行node,您可以执行以下操作:

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

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

注意SWIG和C++:

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

/* Not supported by SWIG */
int foo::bar(int) {
    ... whatever ...
}
< >很少有C++类只限于一个.h文件。


<> PysJavaScript支持SWIG-3.0.1或更高版本。

< P> Node.js和C++有较新的连接方式。求求你,在这里洗劫吧

编辑
最快最简单的方法是。如果您想编写异步附加组件,您可以组合来自nan的
Asyncworker

C++代码与No.js应用集成的三种通用方法 -尽管每个类别都有很多不同:

自动化——在一个子进程中调用C++作为独立的应用程序。 共享库-在共享库(DLL)中打包C++例程,并直接调用NoDE.js中的例程。 < Node.js > AdON—编译C++代码作为原生节点.js模块/插件。 尝试使用linux/unix中的节点程序调用c/c++程序或共享库。windows中的一个选项。这两个包基本上使我们能够调用c/c++程序,类似于我们从终端/命令行调用的方式

例如在ubuntu中:

const shell = require('shelljs');

shell.exec("command or script name");
在windows中:

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

注意:shelljs和node cmd用于运行操作系统命令,不特定于c/c++。

关键字是
扩展
。谷歌关注这个链接。它提供了一个示例程序,并逐步进行了说明。不同的C++编译器创建不同的ABIs,所以使用节点FFI,你可能需要用C接口包装你的C++代码——或者至少我是用VisualStudio来完成这个工作的。有关如何执行此操作的详细信息,请参阅。或者我应该能够在没有包装的情况下使用C++的节点FFI?我知道这篇评论已经有一年多了,但是…是否可以使用没有C包装器的C++ LIBS?我碰到了节点FFI的VS 2017/2019编译问题。这是一个大皮塔!它是依赖于Python2.7还是仅仅是构建过程?NoDEJS中必须有一个标准库Win32 DLL的加载库机制。节点FFI不再被支持,而不是无缝编译,不推荐。如果OP的目标是获得编译C++的性能优势,这将是一个坏主意。它是迂腐的,它不回答这个问题。@格雷戈,但它仍然是一个值得考虑的想法。人们来到这个页面是为了手头的各种类型的项目。我认为Emscripten是一个很好的选择,当你有C/C++代码库并只想在Nodejs使用它时。如果OP的目标是获得编译C++的性能优势,一些好处会用EnScript来翻译,尤其是WASM:没有GC开销,更少的解析和JIT开销,本地整数,AOT优化。在使用Sigg/NoDE.js一段时间后,SIFG似乎无法处理返回数组的C++函数(更确切地说,是返回数组指针的函数)。也就是说,你似乎不能在C++中建立一个函数,返回一个JavaScript数组,并有SWIG自动转换它。@ Sig-Sigg确实是一个神奇的工具,但它不是魔术,它不是一些普通的AI,它可以理解C++代码的语义并生成一个相应的接口。请注意C++和javascript的语义、所有权概念和生命周期管理是如何有根本区别的。因此,您可以从两个方面来查看SWIG:它是一个工具,可以做它能做的事情,并且按照它的规则进行操作。也就是说,你不应该期望看到JavaScript数组弹出返回数组的C++函数。你可以做的就是在C++中包装你的函数,这样它返回一个行为类似数组的对象(例如,代码> STD::vector < /代码>,只是<代码> %包括“STDYVector .I”/CODE >,你可以以一种有点尴尬的方式在JavaScript方面操纵它。请注意,这种方法仍然比自己编写FFI更简单、更安全。使用SWIG的另一种方法是了解下面的机制。花几个月的时间使用它,深入了解它的功能。然后你可以让它生成你想要的接口。您希望它返回一个C++数组的JavaScript数组,很好,您可以这样做,但是您应该首先学习如何表达您期望在这样的接口中的确切语义,并确保它很好地映射到您的问题域。
const cmd = require('node-cmd');
cmd.run('command here');