Node導入C++ライブラリファイル

4470 ワード

プロジェクトはC++言語で実現する暗号化アルゴリズムを導入したため、Node.jsで関連ポートを呼び出す暗号化を実現したので、nodeのダウンロードを実現しようと試みた.jsにC++ライブラリファイルを導入します.このプロジェクトで使用する導入方法は、node-gymモジュールを直接使用してC++ベースのnodeをコンパイルすることである.jsモジュールは、その後、メインプログラムにこのモジュールを導入する.
node-gym
Node-gypはGYP(全称Generate Your Projects、Googleが開発した構築システム)に基づいている.パッケージまたはプロジェクトのbindingを識別します.gypファイル、ここではJSONのファイルがエンジニアリング依存の各種ファイルについて記述し(node版のCMakeListとして理解できる)、このプロファイルに基づいてWindowsの下でVisual Studioプロジェクトファイルを生成するなど、各システムでコンパイル可能なプロジェクトを生成する(*.slnなど)、UnixでMakefileを生成します.これらのプロジェクトファイルを生成した後、node-gypは各システムのコンパイルツール(GCCなど)を呼び出してプロジェクトをコンパイルし、最後のダイナミックリンクライブラリ*.nodeファイルを得ることもできます.
cppインタフェースファイルとgym作成
プラグインは通常、ノードにオブジェクトや関数を漏らすことがあります.jsのJavaScript呼び出し.JavaScriptが関数を呼び出す場合も、入力したパラメータをC/C++コードにマッピングし、関数呼び出しが完了した後、C/C++から返される戻り値をマッピングする必要があります.次のコードでは、JavaScriptから渡された関数を読み込み、戻り値を転送する方法を示します.C++ファイルは次のとおりです.
// AESencrypt.cpp
#include 
//           
#include 
namespace demo {

using v8::Exception;
using v8::FunctionCallbackInfo;
using v8::Isolate;
using v8::Local;
using v8::Number;
using v8::Object;
using v8::String;
using v8::Value;

//    encrypt       , js        args  
void Encrypt(const FunctionCallbackInfo& args) {
  Isolate* isolate = args.GetIsolate();

  //       
  if (args.Length() < 3) {
    //              JavaScript
    isolate->ThrowException(Exception::TypeError(
        String::NewFromUtf8(isolate, "Wrong number of arguments")));
    return;
  }

  //       
  if (!args[0]->IsNumber() || !args[1]->IsNumber()) {
    isolate->ThrowException(Exception::TypeError(
        String::NewFromUtf8(isolate, "Wrong arguments")));
    return;
  }
//      string      
     v8::String::Utf8Value param(args[2]->ToString());
     std::string inputstr= std::string(*param);

char buffer[60];
  //      
aes_encrypt((char *)inputstr.c_str(),args[0],args[1],buffer);

  //       (using the passed in
  // FunctionCallbackInfo&)(       )
  args.GetReturnValue().Set(String::NewFromUtf8(isolate, buffer));
}

void Init(Local exports) {
  NODE_SET_METHOD(exports, "encrypt", Encrypt);
}

NODE_MODULE(AESencrypt, Init)

}  // namespace demo

注目すべきは、開発ノードです.jsプラグインの開発では、以下のような初期化関数を出力する必要があります.
void Initialize(Local exports);
NODE_MODULE(module_name, Initialize)

NODEでMODULEの行末にはセミコロンがありません.これは関数呼び出しではないためです(詳細はnode.hを参照).module_nameはバイナリファイル名が一致しなければなりません(ファイル名の.node接尾辞は含まれません).上記のコードにより、AESencrypt.cppファイルに初期化関数がInitであり、プラグイン名がencryptであることを宣言しました.
次にgymファイルを作成します
{
     "targets": [
     {
         "target_name": "AESencrypt",
             "sources": [ "AESencrypt.cpp" ],
             "include_dirs": ["include"],
             "libraries": [ "

librariesではライブラリファイルを参照すればよいが、システム間の互換性については公式ドキュメントを参照できるものもある.
次に実行
node-gyp configure  
node-gyp build  

コンパイルファイルを生成する.nodeファイル
jsコードで
const AES = require('./build/Release/AESencrypt.node');

参照して、AES.encrypt()で呼び出せばいいです.
いくつかの問題の総括
  • コンパイル中に静的ライブラリを参照することによる問題コンパイルによって生成されるのは動的ライブラリであり、参照されるのは静的ライブラリであり、コンパイル時に
  • がポップアップする可能性がある.
    make: Entering directory '/home/work/work/testAES/build'
      ACTION Regenerating Makefile
      SOLINK_MODULE(target) Release/obj.target/testAES.node
    /usr/bin/ld: /home/work/work/testAES/obj/lib/libaes.a(test_aes.c.o): relocation R_X86_64_32S against `.rodata.cst16' can not be used when making a shared object; recompile with -fPIC
    /home/work/work/testAES/obj/lib/libaes.a: error adding symbols: Bad value
    collect2: error: ld returned 1 exit status
    

    新聞を誤るこの場合、"-fPic"パラメータを追加してライブラリファイルを再コンパイルする必要があります.cmakeでは、次のように書く必要があります.
    set(CMAKE_POSITION_INDEPENDENT_CODE ON)
    
  • 自動生成は、最終的にユーザーに提供される必要があるため、モジュールは異なる環境で再コンパイルする必要がありますが、配置のたびにユーザーにnode-gyp configure buildを実行させるのは明らかに現実的ではありません.package.json
  • と直接付けます
    gypfile": true
    
    npm installを実行するたびに自動的にコンパイルして、問題を便利にすることができます.
    いくつかのモジュールも検討できます
  • node-ffi:このモジュールは直接C++のライブラリに導入することができ、C++コードを操作しないC++ライブラリファイルの
  • 導入を実現する.
  • node-pre-gym: