在 NAPI 中使用 libsodium
Use libsodium in NAPI
我正在使用依赖于 libsodium (libpaseto) 的库。我已经在我的机器上安装了它,我正在尝试构建一个 nodejs 插件。
我有以下 binding.gyp
文件:
{
"targets": [{
"target_name": "testaddon",
"cflags!": [ "-fno-exceptions"],
"cflags_cc!": [ "-fno-exceptions" ],
"cflags_cc":["-std=c++1z" ,"-lsodium","$(pkg-config --cflags libsodium)"],
"ldflags_cc":["$(pkg-config --libs libsodium)"],
"sources": [
"cppsrc/main.cpp",
"cppsrc/functionexample.cpp",
"cppsrc/libpaseto/src/helpers.c",
"cppsrc/libpaseto/src/paseto.c",
"cppsrc/libpaseto/src/paseto_v2_local.c",
"cppsrc/libpaseto/src/paseto_v2_public.c",
],
'include_dirs': [
"<!@(node -p \"require('node-addon-api').include\")"
],
'libraries': [],
'dependencies': [
"<!(node -p \"require('node-addon-api').gyp\")"
],
'defines': [ 'NAPI_DISABLE_CPP_EXCEPTIONS' ,'SODIUM_STATIC=1',
'HAVE_LIBM=1']
}]
}
这是我的插件的代码:
#include "./headers/functionexample.h"
#include <iostream>
#include <fstream>
#include "libpaseto/include/paseto.h"
#include <exception>
Napi::Boolean addon::InitPasetoWrapped(const Napi::CallbackInfo &info)
{
bool returnValue = paseto_init();
Napi::Env env = info.Env();
return Napi::Boolean::New(env, returnValue);
}
Napi::Object addon::Init(Napi::Env env, Napi::Object exports)
{
exports.Set("add", Napi::Function::New(env, addon::addWrapped));
exports.Set("getOsName", Napi::Function::New(env, addon::getOSNameWrapped));
exports.Set("writeToFile", Napi::Function::New(env, addon::writeFileWrapped));
exports.Set("initPaseto", Napi::Function::New(env, addon::InitPasetoWrapped));
return exports;
}
我可以毫无问题地编译它。我正在我的 nodejs 代码中导出一些方法。但是,当我尝试从我的 js 代码 运行 导出的方法 initPaseto
时,出现以下错误:
node:symbol lookup error: undefined symbol:sodium init
我该如何解决?
所以我终于找到了 answer.In libsodium 文档,它提到 you have to pass the -lsodium
flag 能够在没有 problems.So 的情况下进行编译,我必须做的就是在我的库中添加这个标志在 binding.gyp。所以这是我的最终 binding.gyp
文件:
{
"targets": [{
"target_name": "testaddon",
"cflags!": [ "-fno-exceptions"],
"cflags_cc!": [ "-fno-exceptions" ],
"cflags_cc":["-std=c++1z"],
"sources": [
"cppsrc/main.cpp",
"cppsrc/functionexample.cpp",
"cppsrc/libpaseto/src/helpers.c",
"cppsrc/libpaseto/src/paseto.c",
"cppsrc/libpaseto/src/paseto_v2_local.c",
"cppsrc/libpaseto/src/paseto_v2_public.c",
],
'include_dirs': [
"<!@(node -p \"require('node-addon-api').include\")"
],
'libraries': ['-lsodium'],
'dependencies': [
"<!(node -p \"require('node-addon-api').gyp\")"
],
'defines': [ 'NAPI_DISABLE_CPP_EXCEPTIONS' ,'SODIUM_STATIC=1',
'HAVE_LIBM=1']
}]
}
这个 github 问题也帮助我了解了如何在我的项目中添加库:
https://github.com/nodejs/node-gyp/issues/328
我正在使用依赖于 libsodium (libpaseto) 的库。我已经在我的机器上安装了它,我正在尝试构建一个 nodejs 插件。
我有以下 binding.gyp
文件:
{
"targets": [{
"target_name": "testaddon",
"cflags!": [ "-fno-exceptions"],
"cflags_cc!": [ "-fno-exceptions" ],
"cflags_cc":["-std=c++1z" ,"-lsodium","$(pkg-config --cflags libsodium)"],
"ldflags_cc":["$(pkg-config --libs libsodium)"],
"sources": [
"cppsrc/main.cpp",
"cppsrc/functionexample.cpp",
"cppsrc/libpaseto/src/helpers.c",
"cppsrc/libpaseto/src/paseto.c",
"cppsrc/libpaseto/src/paseto_v2_local.c",
"cppsrc/libpaseto/src/paseto_v2_public.c",
],
'include_dirs': [
"<!@(node -p \"require('node-addon-api').include\")"
],
'libraries': [],
'dependencies': [
"<!(node -p \"require('node-addon-api').gyp\")"
],
'defines': [ 'NAPI_DISABLE_CPP_EXCEPTIONS' ,'SODIUM_STATIC=1',
'HAVE_LIBM=1']
}]
}
这是我的插件的代码:
#include "./headers/functionexample.h"
#include <iostream>
#include <fstream>
#include "libpaseto/include/paseto.h"
#include <exception>
Napi::Boolean addon::InitPasetoWrapped(const Napi::CallbackInfo &info)
{
bool returnValue = paseto_init();
Napi::Env env = info.Env();
return Napi::Boolean::New(env, returnValue);
}
Napi::Object addon::Init(Napi::Env env, Napi::Object exports)
{
exports.Set("add", Napi::Function::New(env, addon::addWrapped));
exports.Set("getOsName", Napi::Function::New(env, addon::getOSNameWrapped));
exports.Set("writeToFile", Napi::Function::New(env, addon::writeFileWrapped));
exports.Set("initPaseto", Napi::Function::New(env, addon::InitPasetoWrapped));
return exports;
}
我可以毫无问题地编译它。我正在我的 nodejs 代码中导出一些方法。但是,当我尝试从我的 js 代码 运行 导出的方法 initPaseto
时,出现以下错误:
node:symbol lookup error: undefined symbol:sodium init
我该如何解决?
所以我终于找到了 answer.In libsodium 文档,它提到 you have to pass the -lsodium
flag 能够在没有 problems.So 的情况下进行编译,我必须做的就是在我的库中添加这个标志在 binding.gyp。所以这是我的最终 binding.gyp
文件:
{
"targets": [{
"target_name": "testaddon",
"cflags!": [ "-fno-exceptions"],
"cflags_cc!": [ "-fno-exceptions" ],
"cflags_cc":["-std=c++1z"],
"sources": [
"cppsrc/main.cpp",
"cppsrc/functionexample.cpp",
"cppsrc/libpaseto/src/helpers.c",
"cppsrc/libpaseto/src/paseto.c",
"cppsrc/libpaseto/src/paseto_v2_local.c",
"cppsrc/libpaseto/src/paseto_v2_public.c",
],
'include_dirs': [
"<!@(node -p \"require('node-addon-api').include\")"
],
'libraries': ['-lsodium'],
'dependencies': [
"<!(node -p \"require('node-addon-api').gyp\")"
],
'defines': [ 'NAPI_DISABLE_CPP_EXCEPTIONS' ,'SODIUM_STATIC=1',
'HAVE_LIBM=1']
}]
}
这个 github 问题也帮助我了解了如何在我的项目中添加库: https://github.com/nodejs/node-gyp/issues/328