博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
node.js调用C++函数
阅读量:6689 次
发布时间:2019-06-25

本文共 3007 字,大约阅读时间需要 10 分钟。

新手写的不好勿喷

要想node.js调用C++的函数等,须先将C++代码编译成二进制的.node文件。node.js官方文档 中的C++ addons介绍了如何将C++的代码编译为二进制的.node文件。
一、步骤:
1.首先在项目目录进行npm install -g node-gyp下载node-gyp模块,配置环境参考
2.这是node官方文档中的例子

// addon.cc#include 
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 structvoid 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文件,内容为

{  "targets": [    {      "target_name": "addon",      "sources": [ "addon.cc" ]    }  ]}

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

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

// test.jsconst addon = require('./build/Release/addon');console.log('This should be eight:', addon.add(3, 5));//结果为8

二、实例

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

clipboard.png

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

"include_dirs": [        "./gdal/include"      ],

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

'libraries': [         "../gdal/lib/gdal_i.lib",      ],

这时的binding.gyp文件为

{  "targets": [    {      "target_name": "addon",      "sources": [        "./C++_02/tile.cc"      ],      "include_dirs": [        "./gdal/include"      ],      'libraries': [         "../gdal/lib/gdal_i.lib",      ],    }  ]}

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

const addon=require(‘./build/Release/addon’)var imagefile = "/vsicurl/http://sasmac.oss-cn-beijing.aliyuncs.com/cog.tif";var x = 160;var y = 83;var l = 9;console.log(addon.tileload(imagefile, x, y, l));

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

转载地址:http://iwuoo.baihongyu.com/

你可能感兴趣的文章
我的友情链接
查看>>
CSS元素定位
查看>>
质量时代——“Jolt大奖精选丛书”有奖征文
查看>>
Python list方法总结
查看>>
DNS服务器维护命令
查看>>
PHP DES加密解密封装类
查看>>
python 之time和datetime的搭配秘密
查看>>
授之以渔-运维平台应用模块三(BIND篇)
查看>>
初始API编程
查看>>
【NetDIY应用开发-01】Hello world
查看>>
六、用户与权限
查看>>
面向机器学习数据平台的设计与搭建
查看>>
centos6.7 编译安装mysql-5.6.27
查看>>
spring cloud 整合zpkin问题
查看>>
Maven下载慢的解决方案
查看>>
我的友情链接
查看>>
Android 核心分析 之七------Service深入分析
查看>>
Regsvr32使用方法
查看>>
2015/5/2 (一) 浅谈PHP的几个运行模式
查看>>
柱形图Demo
查看>>