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++ファイルは次のとおりです.
注目すべきは、開発ノードです.jsプラグインの開発では、以下のような初期化関数を出力する必要があります.
NODEでMODULEの行末にはセミコロンがありません.これは関数呼び出しではないためです(詳細は
次にgymファイルを作成します
librariesではライブラリファイルを参照すればよいが、システム間の互換性については公式ドキュメントを参照できるものもある.
次に実行
コンパイルファイルを生成する.nodeファイル
jsコードで
参照して、
いくつかの問題の総括コンパイル中に静的ライブラリを参照することによる問題コンパイルによって生成されるのは動的ライブラリであり、参照されるのは静的ライブラリであり、コンパイル時に がポップアップする可能性がある.
新聞を誤るこの場合、自動生成は、最終的にユーザーに提供される必要があるため、モジュールは異なる環境で再コンパイルする必要がありますが、配置のたびにユーザーに と直接付けます
いくつかのモジュールも検討できます node-ffi:このモジュールは直接C++のライブラリに導入することができ、C++コードを操作しないC++ライブラリファイルの 導入を実現する. node-pre-gym:
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
注目すべきは、開発ノードです.jsプラグインの開発では、以下のような初期化関数を出力する必要があります.
void Initialize(Local
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
を実行するたびに自動的にコンパイルして、問題を便利にすることができます.いくつかのモジュールも検討できます