軟件准備
-
windows7或者更高版本
-
C:\Users\macrored\Desktop>python --version Python 3.7.7
-
C:\Users\macrored\Desktop>node -v v12.16.1
-
vs_BuildTools/Visual Studio 15或者更高版本
實例
新建一個文件夾
- 新建package.json
{
"name": "test-cpp-module",
"version": "0.1.0",
"private": true,
"gypfile": true,
"dependencies": {
"node-addon-api": "^2.0.0"
}
}
- 新建binding.gyp
{
"targets": [
{
"target_name": "democpp",
"sources": [
"democpp.cc"
],
"include_dirs": [
"<!@(node -p \"require('node-addon-api').include\")"
],
"libraries": [
],
"dependencies": [
"<!(node -p \"require('node-addon-api').gyp\")"
],
"cflags!": ["-fno-exceptions"],
"cflags_cc!": ["-fno-exceptions"],
"defines": ["NAPI_CPP_EXCEPTIONS"],
"xcode_settings": {
"GCC_ENABLE_CPP_EXCEPTIONS": "YES"
}
}
]
}
文件中首先使用target_name指定了編譯之后模塊的名稱。
sources指明c++的源文件,如果有多個文件,需要用逗號隔開,放到同一個數組中。
include_dirs是編譯時使用的頭文件引入路徑,這里使用node -p執行node-addon-api模塊中的預置變量。
dependencies是必須的,不要改變。
后面部分,cflags!/cflags_cc!/defines三行指定如果c++程序碰到意外錯誤的時候,由NAPI接口來處理,而不是通常的由c++程序自己處理。這防止因為c++部分程序碰到意外直接就退出了程序,而是由nodejs程序來捕獲處理。如果是在Linux中編譯使用,有這三行就夠了。
但如果是在macOS上編譯使用,則還要需要最后一項xcode-settings設置,意思相同,就是關閉macOS編譯器的意外處理功能。
- democpp.cc
#include <napi.h>
using namespace Napi;
String Hello(const CallbackInfo& info) {
return String::New(info.Env(), "world");
}
Napi::Object Init(Env env, Object exports) {
exports.Set("hello", Function::New(env, Hello));
return exports;
}
NODE_API_MODULE(addon, Init)
程序中引入napi.h頭文件,使用Napi的namespace還有最后的NODE_API_MODULE(addon,Init)都是模板化的,照抄過來不用動。
Init函數中,使用exports.Set()
引出要暴露給nodejs調用的函數。如果有多個需要引出的函數,就寫多行。
Hello函數是我們主要完成工作的部分,本例中很簡單,只是用字符串的方式返回一個“world”。
democpp.cc/binding.gyp/package.json
三個文件都創建好,在當前文件夾開啟命令行,保持網絡暢通,運行npm install
,順利編譯,此時在得到輸出文件.\build\Release\democpp.node
,下一步,在node
中調用hello()
E:\WorkSpace\Code\node-addon-cplus>node
Welcome to Node.js v12.16.1.
Type ".help" for more information.
> testapp=require('./build/Release/democpp.node')
{ hello: [Function] }
> testapp.hello()
'world'
>
提供上述實例源文件鏈接
注意事項
-
使用nodejs12、python3和Visual Studio 15可以編譯上述接口,但是生成出來
democpp.node
的文件大小有500+KB,作為一個接口模塊而言有些體積損耗。如果使用nodejs10.xx環境,僅僅安裝npm install -g windows-build-tools
(其中windows-build-tools會自動安裝python2.7以及vs2017編譯工具),使用npm install
進行編譯,可以大大減少democpp.node
的文件大小。 -
編譯時nodejs的32位(64位)決定了
democpp.node
32位(64位)