windowsでnode-gyp使ってC++ addon をコンパイルしてみる

今回の概要図

今回使うのは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を読むとPythonVisual 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

sささ
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を使ってコンパイルすることができました

ブログ村リンク
ポチッと押してね!フォローもしてね!

ブログランキング・にほんブログ村へ
にほんブログ村
おすすめの記事