visualStudio封装nodejs的C++扩展
1.背景
都知道vscode在封装nodejs的C++扩展时,通过配置python、node-gyp等环境,就可以在windows和linux下编译出.node,但本人觉得那个环境配置比较麻烦,简单的代码一小时,环境三四天。对于偏爱vs开发C++的我,对vs在windows下编译.node进行了相关研究。
2.清单
- visual studio;(2)nodejs头文件;(3)nodejs库文件即node.lib。
3.配置
(1)新建控制台应用程序;
(2)打开项目=》属性=》C/C++=》附加包含目录,加入nodejs的头文件目录;
(3)打开项目=》属性=》链接器=》附加库目录,加入nodejs的库所在目录;
(4)打开项目=》属性=》链接器=》输入,加入node.lib;
(5)打开项目=》属性=》常规=》配置类型,选择动态链接库;
(6)打开项目=》属性=》常规=》扩展名,输入.node;
至此,配置完成,是不是非常简单,当然这也是visual studio使用的基本手法,以上要注意的是,附加包含目录尽量不要填到了VC++中的库目录,具体细节可以看看这两者的区别。
4.Demo
以下是一个简单的求和函数,没有返回值,仅打印结果,本文的主要目的是介绍方法,具体细节可参考nodejs官方文档。
#include <iostream>
#include <node.h>
#include <v8.h>
using namespace std;
using namespace cv;
using namespace v8;
void add(const FunctionCallbackInfo<Value>& args) {
v8::Isolate* isolate = args.GetIsolate();
isolate = args.GetIsolate();
v8::HandleScope scope(isolate);
int argnum = args.Length();
if (argnum != 2)
{
cout << "Wrong parameter" << endl;
return;
}
if (!args[0]->IsNumber() || !args[1]->IsNumber())
{
cout << "parameters type error" << endl;
return;
}
// 解析第一个参数
int num1 = args[0].As<Number>()->Value();
cout << "num1: " << num1 << endl;
// 解析第二个参数
int num2 = args[1].As<Number>()->Value();
cout << "num2: " << num2 << endl;
int sum = num1+num2;
cout<<”sum is:”<<sum <<endl;
}
void Initialize(Local<Object> exports) {
NODE_SET_METHOD(exports, "add", add);
}
NODE_MODULE(test,
这是一个最简单的demo,更多可参考官网。
5.测试
编译项目在步骤4中会生成test.node,编写简单js脚本对生成的扩展进行测试。
let add = require(“./test.node”);
add(1,2);
运行结果:
sum is 3
6.调试.node
在项目属性中配置相关调试属性等,然后在C++代码中打上断点,即可进行调试。
7.总结
本文介绍了windows下利用visualstudio开发nodejs的C++扩展的方法,优点是配置简单,熟悉C++熟悉vs的人可以很快上手,缺点暂未发现。下一阶段目标是研究linux下利用libnode.a以及头文件以同样的方式在vs中远程开发nodejs的C++扩展,目前的进展是已经源码编译出linux下的nodejs共享库。