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

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

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

  1. Node addon

  2. 使用node-ffi

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

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

所以我的问题是:

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

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

【问题讨论】:

标签: node.js node.js-addon node-ffi


【解决方案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 使用的东西一样)请参阅stackoverflow.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 库中。

    【讨论】:

    【解决方案4】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-26
      • 2017-05-12
      • 2014-06-13
      相关资源
      最近更新 更多