从 Node.js 调用 C++ 库(Node addons / node-ffi)

Posted

技术标签:

【中文标题】从 Node.js 调用 C++ 库(Node addons / node-ffi)【英文标题】:Call C++ library from Node.js (Node addons / node-ffi) 【发布时间】:2013-09-09 06:28:15 【问题描述】:

我正在尝试将外部 C++ 库(我可以访问 .so 文件以及头文件)集成到我的 Node.js 应用程序中。

经过大量研究,我的选择减少到:

    写Node addon

    使用node-ffi

从 node-ffi 的 gitHub 的定义中,我无法判断它是否会直接在 C++ 库上工作:

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

所以我的问题是:

选项 1) 是否意味着以某种方式重写外部 C++ 库? node-ffi 是否能够直接调用 C++ 库而无需我必须编写任何类型的 C 包装器?

我不是 C/C++ 方面的专家,所以如果我遗漏了一些让您能够回答的基本问题,请告诉我,以便我改进我的问题。

【问题讨论】:

有一个类似的问题:***.com/questions/16783023/… 但我认为它并没有完全回答我的问题。 【参考方案1】:

node-ffi 似乎主要用于 C 程序。我在上周经历了这个,发现节点插件的运气要好得多。您需要做的是在库中的 C++ 代码和 node.js 之间编写一个 shim。在我的例子中,我需要为安全协议编码和解码数据包,所以我制作了包含数据包的节点缓冲区,并编写了从缓冲区中取出数据的 C++ 代码,然后将数据发送到我的 C 代码进行编码和解码的数据包。

此页面:http://luismreis.github.io/node-bindings-guide/docs/returning.html 有一些很好的示例,说明如何在 C++ 中将数据输入和输出 node.js 缓冲区。

【讨论】:

ffi 与 C++ 一起工作,只需使用 extern "C" 来定义你的 lib 的接口(就像你用 C++ 编写的任何可能被 C 使用的东西一样)请参阅***.com/questions/16783023/… 了解详细信息。跨度> 【参考方案2】:

nbind 现在可以更轻松地使用外部 C++ 库编写 Node.js 插件。您基本上创建了一个新的源文件,包括库头文件、nbind 头文件和一些列出库的类和方法的宏调用。然后 nbind 处理剩下的事情。

libui-node 是一个真实的示例,使用 nbind 调用 libui 以使用来自 Node.js 的本机小部件生成用户界面。还有一个 short tutorial 如何为 vg 创建绑定,这是一个与生物信息学相关的 C++ 库。

【讨论】:

【参考方案3】:

其他答案缺少什么?我很乐意提供帮助。那里的代码示例是用 C++ 编写的。我正在说明人们(使用 C 或 C++ 制作库)如何定义外部接口供其他人使用。 ffi 的重点是您使用您使用的任何语言(在本例中为 javascript)而不是 C/C++(如在节点扩展的情况下)编写包装器。如果您的原始库是用于其他事物的共享 DLL,它已经有一个接口,你只需要在 javascript 中编写包装代码来告诉 node 它是如何工作的,而不是用 C++ 编写一些东西并将其暴露在本地 nodejs 库中。

【讨论】:

你可以在这里找到信息github.com/rbranson/node-ffi/wiki/Node-FFI-Tutorial 这是包装一些sqlite方法的例子。 lib 是 C 还是 C++ 的事实无关紧要,只是它定义了一个接口(就像所有共享库一样。)【参考方案4】:

有一种非常简单的方法可以链接您的任何库 (.so .dll .a)。您应该在binging.gyp 文件中添加具有正确路径的库:


  "targets": [
    
      "target_name": "addon",
      "sources": [ "hello.cc" ],
      "libraries": [
            "path/toYourLibrary/yourLibName.dll or yourLibName.so"
          ] 
    
  ]

还有更简单的方法可以使用nan 编写好的插件。查看链接了解更多信息github link

【讨论】:

以上是关于从 Node.js 调用 C++ 库(Node addons / node-ffi)的主要内容,如果未能解决你的问题,请参考以下文章

使用 node.js 从 C++ 调用 JavaScript

如何从 node.js 调用外部脚本/程序

无法通过递归调用node.js中的函数从promises获得响应

Protobuf 和 Node.JS 库错误

Node.js C++ 插件学习指南

使用包含来自 Node.js 的 char 数组的结构调用 C++ dll