windows下node.js通过N-API调用c++函数
环境准备
- vscode安装(以下均在vscode中操作)
- node.js安装,版本不要太老
- c 工具链安装,安装Visual Studio2019社区版即可,或者执行
npm install --global windows-build-tools
(这个我没试过,windows喜欢用vs2019) - 安装编译构建工具
npm install -g node-gyp
项目初始化
- 新建文件夹 c2js ,命令行进入所在文件夹,执行
pnpm init
或者npm init
初始化 - 安装依赖
pnpm add node-addon-api
或npm install node-addon-api
- 按下ctrl shift P,搜索c ,添加
c_cpp_properties.json
文件 - 创建文件binding.gyp,文件内容如下:
{
"targets": [
{
"target_name": "napi_sample",
"sources": [ "src/main.cpp"],
"cflags!": [ "-fno-exceptions" ],
"cflags_cc!": [ "-fno-exceptions" ],
"defines": [ "NAPI_DISABLE_CPP_EXCEPTIONS" ],
"include_dirs": [
"<!@(node -p \"require('node-addon-api').include\")"
],
}
]
}
- 命令行执行
node-gyp configure
,没有binding.gyp文件会失败;执行之后将Dnode_root_dir(下图红色框)添加到c_cpp_properties.json
的includePath中。
至此,准备工作完成。
以下是我的开发环境版本信息,index.js中只有一行代码console.log(process.versions)
示例实战
- 新建文件夹
src
,并在src文件夹下新建文件main.cpp
,binding.gyp中的source即c 源文件
#include<napi.h>
int plus(int a, int b){
return a b;
}
// 调用函数(我把c 函数独立出来了,个人风格)
Napi::Value add(const Napi::CallbackInfo& info){
Napi::Env env = info.Env();
Napi::EscapableHandleScope scope(env);
if (info.Length() < 2)
return Napi::Boolean::New(env, false);
int res = plus(info[0].As<Napi::Number>().Int64Value(), info[1].As<Napi::Number>().Int64Value());
return Napi::Number::New(env, res);
}
// 导出此函数
Napi::Object Init(Napi::Env env, Napi::Object exports)
{
// 第一个参数定义了导出的函数名
exports.Set(Napi::String::New(env, "add"), Napi::Function::New(env, add));
return exports;
}
// 第一个参数即为导出的模块名,与binding中的target_name对应
NODE_API_MODULE(napi_sample, Init);
在引入napi.h
的时候可能会飘红,鼠标移到红色线,点击quick fix选择第一个增加includePath即可。
我的c_cpp_properties.json
文件如下:
{
"configurations": [
{
"name": "Win32",
"includePath": [
"${workspaceFolder}/**",
"C:\\Users\\11441\\AppData\\Local\\node-gyp\\Cache\\16.17.1",
"C:/Users/11441/AppData/Local/node-gyp/Cache/16.17.1/include/node"
],
"defines": [
"_DEBUG",
"UNICODE",
"_UNICODE"
],
"windowsSdkVersion": "10.0.19041.0",
"compilerPath": "D:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.29.30133/bin/Hostx64/x64/cl.exe",
"cStandard": "c17",
"cppStandard": "c 17",
"intelliSenseMode": "windows-msvc-x64"
}
],
"version": 4
}
- 命令行执行
node-gyp rebuild
进行构建,不报错即大功告成,如下图所示。 - 新建
index.js
文件,在命令行执行node index.js
。
// index.js
const {add} = require('./build/Release/napi_sample.node');
console.log(add(1, 2));
推荐阅读
最后
在webpack打包的项目中,直接使用require是无法正确引用node文件的。经过多次尝试,最终在bindings包中找到了答案
// https://github.com/webpack/webpack/issues/4175#issuecomment-342931035
var requireFunc =
typeof __webpack_require__ === 'function'
? __non_webpack_require__
: require;
是的,就是使用如上所示的代码引入require函数。在umi项目中,我是将node文件放在public文件夹下。在electrone打包应用程序的时候,会把public文件夹下的内容也打包进去,但路径会变
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhggaeeb
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01