10

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

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

  1. 编写节点插件

  2. 使用node-ffi

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

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

所以我的问题是:

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

我不是 C/C++ 方面的专家,所以如果我错过了一些基本的内容供您回答,请告诉我,以便我改进我的问题。

4

4 回答 4

7

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

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

于 2014-02-25T02:07:34.377 回答
3

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

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

于 2016-11-28T03:18:01.387 回答
2

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

于 2014-07-09T02:46:19.963 回答
1

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

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

还有更简单的方法可以使用nan. 检查链接以获取更多信息github 链接

于 2017-07-26T07:39:24.613 回答