今回の概要図
今回使うのはnode,node-gypを使ってJavaScriptからC++を呼び出したいと思います。
開発環境はWindows10になります。
事前準備
ソースコードを用意します。
hello.js
var addon = require('./build/Release/addon');
console.log( addon.hello() );
hello.cc
#include <node.h>
#include <v8.h>
using namespace node;
using namespace v8;
void Method(const FunctionCallbackInfo<Value>& args) {
Isolate *isolate = args.GetIsolate();
HandleScope scope(isolate);
Local<v8::String> result;
MaybeLocal<v8::String> str = String::NewFromUtf8(isolate, "Hello World!");
str.ToLocal(&result);
args.GetReturnValue().Set(result);
}
void init(Local<Object> exports) {
NODE_SET_METHOD(exports, "hello", Method);
}
NODE_MODULE(NODE_GYP_MODULE_NAME, init)
binding.gyp
{
"targets": [
{
"target_name": "addon",
"sources": [
"hello.cc"
]
}
]
}
node-gypのgithubリンク
Readmeを見ながら進めていく。
https://github.com/nodejs/node-gyp
node-gypをグローバルでインストールする
npm install -g node-gyp
Readmeを読むとPythonとVisual C ++ビルド環境が必要と書いてありますが、私の環境では既にPythonがinstallされていることがわかります。
Pythonをインストールする
Pythonがインストールされていなければ、インストールします
https://www.microsoft.com/ja-jp/p/python-310/9pjpw5ldxlz5?activetab=pivot:overviewtab
Visual C ++ビルド環境をインストールする
ここが少し大変ですが、順番に試していきましょう。
PowerShellを管理者権限で実行します。
npm install -g windows-build-tools
PS C:\WINDOWS\system32> npm install -g windows-build-tools
npm WARN deprecated har-validator@5.1.5: this library is no longer supported
npm WARN deprecated uuid@3.4.0: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.
npm WARN deprecated request@2.88.2: request has been deprecated, see https://github.com/request/request/issues/3142
npm WARN deprecated windows-build-tools@5.2.2: Node.js now includes build tools for Windows. You probably no longer need this tool. See https://github.com/felixrieseberg/windows-build-tools for details.
[##################] | reify:ajv: timing reifyNode:node_modules/windows-build-tools Completed in 1762ms
※実行してみると途中で止まってしまいます。
インストールされているか確認してみます。
私の場合、下記の場所にnodeのグローバルがインストールされています。
C:\Users\admin\AppData\Roaming\npm\node_modules
windows-build-toolsがインストールされているようですので、PowerShellを閉じます。
※Ctrl + Cでプログラムを中止すると作成されたフォルダが消えますのでPowerShellを閉じます。
node-gyp configureを試してみます。
node-gyp configure
gyp info it worked if it ends with ok
gyp info using node-gyp@9.0.0
gyp info using node@16.14.0 | win32 | x64
gyp info find Python using Python version 3.10.2 found at "C:\Users\admin\AppData\Local\Programs\Python\Python310\python.exe"
gyp info find VS using VS2017 (15.9.28307.1831) found at:
gyp info find VS "C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools"
gyp info find VS run with --verbose for detailed information
gyp info spawn C:\Users\admin\AppData\Local\Programs\Python\Python310\python.exe
gyp info spawn args [
gyp info spawn args 'C:\\Users\\admin\\AppData\\Roaming\\npm\\node_modules\\node-gyp\\gyp\\gyp_main.py',
gyp info spawn args 'binding.gyp',
gyp info spawn args '-f',
gyp info spawn args 'msvs',
gyp info spawn args '-I',
gyp info spawn args 'C:\\Users\\admin\\Desktop\\multiCPU\\build\\config.gypi',
gyp info spawn args '-I',
gyp info spawn args 'C:\\Users\\admin\\AppData\\Roaming\\npm\\node_modules\\node-gyp\\addon.gypi',
gyp info spawn args '-I',
gyp info spawn args 'C:\\Users\\admin\\AppData\\Local\\node-gyp\\Cache\\16.14.0\\include\\node\\common.gypi',
gyp info spawn args '-Dlibrary=shared_library',
gyp info spawn args '-Dvisibility=default',
gyp info spawn args '-Dnode_root_dir=C:\\Users\\admin\\AppData\\Local\\node-gyp\\Cache\\16.14.0',
gyp info spawn args '-Dnode_gyp_dir=C:\\Users\\admin\\AppData\\Roaming\\npm\\node_modules\\node-gyp',
gyp info spawn args '-Dnode_lib_file=C:\\\\Users\\\\admin\\\\AppData\\\\Local\\\\node-gyp\\\\Cache\\\\16.14.0\\\\<(target_arch)\\\\node.lib',
gyp info spawn args '-Dmodule_root_dir=C:\\Users\\admin\\Desktop\\multiCPU',
gyp info spawn args '-Dnode_engine=v8',
gyp info spawn args '--depth=.',
gyp info spawn args '--no-parallel',
gyp info spawn args '--generator-output',
gyp info spawn args 'C:\\Users\\admin\\Desktop\\multiCPU\\build',
gyp info spawn args '-Goutput_dir=.'
gyp info spawn args ]
gyp info ok
エラーが消えました。
ビルド
ビルドする方法は2種類あります。
①
こちらは普通のビルドですが、2回コマンド打つ必要があります。
configureをすると、buildフォルダが作成されます。
node-gyp configure
gyp info it worked if it ends with ok
gyp info using node-gyp@9.0.0
gyp info using node@16.14.0 | win32 | x64
gyp info find Python using Python version 3.10.2 found at "C:\Users\admin\AppData\Local\Programs\Python\Python310\python.exe"
gyp info find VS using VS2017 (15.9.28307.1831) found at:
gyp info find VS "C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools"
gyp info find VS run with --verbose for detailed information
gyp info spawn C:\Users\admin\AppData\Local\Programs\Python\Python310\python.exe
gyp info spawn args [
gyp info spawn args 'C:\\Users\\admin\\AppData\\Roaming\\npm\\node_modules\\node-gyp\\gyp\\gyp_main.py',
gyp info spawn args 'binding.gyp',
gyp info spawn args '-f',
gyp info spawn args 'msvs',
gyp info spawn args '-I',
gyp info spawn args 'C:\\Users\\admin\\Desktop\\multiCPU\\build\\config.gypi',
gyp info spawn args '-I',
gyp info spawn args 'C:\\Users\\admin\\AppData\\Roaming\\npm\\node_modules\\node-gyp\\addon.gypi',
gyp info spawn args '-I',
gyp info spawn args 'C:\\Users\\admin\\AppData\\Local\\node-gyp\\Cache\\16.14.0\\include\\node\\common.gypi',
gyp info spawn args '-Dlibrary=shared_library',
gyp info spawn args '-Dvisibility=default',
gyp info spawn args '-Dnode_root_dir=C:\\Users\\admin\\AppData\\Local\\node-gyp\\Cache\\16.14.0',
gyp info spawn args '-Dnode_gyp_dir=C:\\Users\\admin\\AppData\\Roaming\\npm\\node_modules\\node-gyp',
gyp info spawn args '-Dnode_lib_file=C:\\\\Users\\\\admin\\\\AppData\\\\Local\\\\node-gyp\\\\Cache\\\\16.14.0\\\\<(target_arch)\\\\node.lib',
gyp info spawn args '-Dmodule_root_dir=C:\\Users\\admin\\Desktop\\multiCPU',
gyp info spawn args '-Dnode_engine=v8',
gyp info spawn args '--depth=.',
gyp info spawn args '--no-parallel',
gyp info spawn args '--generator-output',
gyp info spawn args 'C:\\Users\\admin\\Desktop\\multiCPU\\build',
gyp info spawn args '-Goutput_dir=.'
gyp info spawn args ]
gyp info ok
作成されたbuildフォルダ
ビルドコマンドを実行します。
node-gyp build
gyp info it worked if it ends with ok
gyp info using node-gyp@9.0.0
gyp info using node@16.14.0 | win32 | x64
gyp info spawn C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin\MSBuild.exe
gyp info spawn args [
gyp info spawn args 'build/binding.sln',
gyp info spawn args '/clp:Verbosity=minimal',
gyp info spawn args '/nologo',
gyp info spawn args '/p:Configuration=Release;Platform=x64'
gyp info spawn args ]
このソリューション内のプロジェクトを 1 度に 1 つずつビルドします。並行ビルドを有効にするには、"/m" スイッチを追加してください。
hello.cc
win_delay_load_hook.cc
ライブラリ C:\Users\admin\Desktop\multiCPU\build\Release\addon.lib とオブジェクト C:\Users\admin\Desktop\multiCPU\build\Release\addon.ex
p を作成中
コード生成しています。
All 29 functions were compiled because no usable IPDB/IOBJ from previous compilation was found.
コード生成が終了しました。
addon.vcxproj -> C:\Users\admin\Desktop\multiCPU\build\Release\\addon.node
gyp info ok
buildフォルダの中にReleaseフォルダが作成されました。
②
こちらの方が楽です。
こっちは一回のコマンドでclean & configure & buildをやっているようなので、何度も実行する場合、こちらでいいと思います。
最初の一回目からrebuildでいいと思います。
buildを使う場合,configureをしないとエラーになるのではまる可能性があります。
node-gyp rebuild
gyp info it worked if it ends with ok
gyp info using node-gyp@9.0.0
gyp info using node@16.14.0 | win32 | x64
gyp info find Python using Python version 3.10.2 found at "C:\Users\admin\AppData\Local\Programs\Python\Python310\python.exe"
gyp info find VS using VS2017 (15.9.28307.1831) found at:
gyp info find VS "C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools"
gyp info find VS run with --verbose for detailed information
gyp info spawn C:\Users\admin\AppData\Local\Programs\Python\Python310\python.exe
gyp info spawn args [
gyp info spawn args 'C:\\Users\\admin\\AppData\\Roaming\\npm\\node_modules\\node-gyp\\gyp\\gyp_main.py',
gyp info spawn args 'binding.gyp',
gyp info spawn args '-f',
gyp info spawn args 'msvs',
gyp info spawn args '-I',
gyp info spawn args 'C:\\Users\\admin\\Desktop\\multiCPU\\build\\config.gypi',
gyp info spawn args '-I',
gyp info spawn args 'C:\\Users\\admin\\AppData\\Roaming\\npm\\node_modules\\node-gyp\\addon.gypi',
gyp info spawn args '-I',
gyp info spawn args 'C:\\Users\\admin\\AppData\\Local\\node-gyp\\Cache\\16.14.0\\include\\node\\common.gypi',
gyp info spawn args '-Dlibrary=shared_library',
gyp info spawn args '-Dvisibility=default',
gyp info spawn args '-Dnode_root_dir=C:\\Users\\admin\\AppData\\Local\\node-gyp\\Cache\\16.14.0',
gyp info spawn args '-Dnode_gyp_dir=C:\\Users\\admin\\AppData\\Roaming\\npm\\node_modules\\node-gyp',
gyp info spawn args '-Dnode_lib_file=C:\\\\Users\\\\admin\\\\AppData\\\\Local\\\\node-gyp\\\\Cache\\\\16.14.0\\\\<(target_arch)\\\\node.lib',
gyp info spawn args '-Dmodule_root_dir=C:\\Users\\admin\\Desktop\\multiCPU',
gyp info spawn args '-Dnode_engine=v8',
gyp info spawn args '--depth=.',
gyp info spawn args '--no-parallel',
gyp info spawn args '--generator-output',
gyp info spawn args 'C:\\Users\\admin\\Desktop\\multiCPU\\build',
gyp info spawn args '-Goutput_dir=.'
gyp info spawn args ]
gyp info spawn C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin\MSBuild.exe
gyp info spawn args [
gyp info spawn args 'build/binding.sln',
gyp info spawn args '/clp:Verbosity=minimal',
gyp info spawn args '/nologo',
gyp info spawn args '/p:Configuration=Release;Platform=x64'
gyp info spawn args ]
このソリューション内のプロジェクトを 1 度に 1 つずつビルドします。並行ビルドを有効にするには、"/m" スイッチを追加してください。
hello.cc
win_delay_load_hook.cc
ライブラリ C:\Users\admin\Desktop\multiCPU\build\Release\addon.lib とオブジェクト C:\Users\admin\Desktop\multiCPU\build\Release\addon.ex
p を作成中
コード生成しています。
All 29 functions were compiled because no usable IPDB/IOBJ from previous compilation was found.
コード生成が終了しました。
addon.vcxproj -> C:\Users\admin\Desktop\multiCPU\build\Release\\addon.node
gyp info ok
プログラムの実行
node .\hello.js
期待通り動作しました!
これでnode-gypをWindowsを使ってコンパイルすることができました