【问题标题】:Use libsodium in NAPI在 NAPI 中使用 libsodium
【发布时间】:2019-08-31 18:50:56
【问题描述】:

我正在使用一个依赖于 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

我该如何解决?

【问题讨论】:

    标签: node.js node-gyp libsodium


    【解决方案1】:

    所以我终于找到了答案。在 libsodium 文档中,它提到 you have to pass the -lsodium flag 能够毫无问题地编译。所以我要做的就是在我的 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

    【讨论】:

      猜你喜欢
      • 2018-01-27
      • 1970-01-01
      • 2014-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-28
      • 2015-02-08
      • 2014-04-22
      相关资源
      最近更新 更多