node.js调用C++函数的方法示例

前端之家收集整理的这篇文章主要介绍了node.js调用C++函数的方法示例前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

目前nodejs调用c++主流的有两种方法,分别是addons和ffi

addons是nodejs官方的c++扩展实现方案,但是由于需要使用模版,并且要对v8引擎有一定的了解,入门门槛较高。

ffi是nodejs直接调用so库的一种实现,可以调用纯c的接口。

要想node.js调用C++的函数等,须先将C++代码编译成二进制的.node文件。node.js官方文档中的C++ addons介绍了如何将C++的代码编译为二进制的.node文件。

一、步骤:

1.首先在项目目录进行npm install -g node-gyp下载node-gyp模块,配置环境参考

2.这是node官方文档中的例子

namespace demo { using v8::Exception; using v8::FunctionCallbackInfo; using v8::Isolate; using v8::Local; using v8::Number; using v8::Object; using v8::String; using v8::Value;// This is the implementation of the "add" method// Input arguments are passed using the// const FunctionCallbackInfo& args struct void Add(const FunctionCallbackInfo& args) { Isolate* isolate = args.GetIsolate(); // Check the number of arguments passed. if (args.Length() < 2) { // Throw an Error that is passed back to JavaScript isolate->ThrowException(Exception::TypeError( String::NewFromUtf8(isolate,"Wrong number of arguments"))); return; } // Check the argument types if (!args[0]->IsNumber() || !args[1]->IsNumber()) { isolate->ThrowException(Exception::TypeError( String::NewFromUtf8(isolate,"Wrong arguments"))); return; } // Perform the operation double value = args[0]->NumberValue() + args[1]->NumberValue(); Local num = Number::New(isolate,value); // Set the return value (using the passed in // FunctionCallbackInfo&) args.GetReturnValue().Set(num);} void Init(Local exports) { NODE_SET_METHOD(exports,"add",Add);}NODE_MODULE(NODE_GYP_MODULE_NAME,Init) } // namespace demo

3.然后在项目目录下使用类似JSON的格式创建在项目顶层调用文件binding.gyp文件内容

4.在终端输入node-gyp configure命令生成一个build文件夹,然后输入node-gyp build命令生成编译addon.node文件

5.在node文件比如test.js文件中const addon=require(‘./build/Release/addon')调用生成的模块

二、实例

最近公司让我研究node调用C++,C++的代码调用了GDAL库开发的功能。要在tile.cc文件调用文件

调用的gdal_priv.h和ogrsf_frmts.h头文件在gdal/include文件夹中,所以要在binding.gyp文件中source后面添加

然后如果现在就运行node-gyp configure build命令会报“无法解析的外部符号”的错误,这是因为还需要加入调用链接库,需要在binding.gyp文件中加入

这时的binding.gyp文件

这时再进行node-gyp configure build命令就不会报错生成addon.node文件,但是当我运行test.js文件

会报错'找不到指定的模块',但是我们在build/Release文件中能找到addon.node文件,这是因为缺少依赖也就是缺少.dll。下载Dependency Walker,这个软件可以帮你确定一下缺少什么.dll,下载地址:nofollow" target="_blank" href="http://www.dependencywalker.com/">http://www.dependencywalker.com/。我将addon.node文件添加到Dependency Walker发现缺少gdal/bin中的.dll。我将gdal/bin中的.dll文件复制到addon.node目录下,这时运行test.js文件就可以正常使用了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程之家。

猜你在找的Node.js相关文章