从 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