将 stdlib 和 rand 与 Node 本机模块 (node-gyp) 一起使用

Use stdlib and rand with Node native module (node-gyp)

这只是问题的一个例子。

假设我有 utils.cc

#include "../headers/utils/utils.h"

double sum()
{
    double result = 1 + 1;
    return result;
}

double multisum(int n)
{
    double result = 0;
    for (int i = 0; i < n; i++)
    {
        result += rand();
    }
    return result;
}

以及使用它的文件

#include "../headers/modules/sum.h"
#include "../headers/utils.h"

/* HELPERS DECLARATION */

static void ReturnResult(int result, const FunctionCallbackInfo<Value> &args);

/* EXPORTED IMPLEMENTATION */

void Sum(const FunctionCallbackInfo<Value> &args)
{
    double result = sum();
    ReturnResult(result, args);
}
void Multisum1e7(const FunctionCallbackInfo<Value> &args)
{
    int result = multisum(1e7);
    ReturnResult(result, args);
}

/* HELPERS IMPLEMENTATION */

static void ReturnResult(double result, const FunctionCallbackInfo<Value> &args)
{
    Isolate *isolate = args.GetIsolate();
    args.GetReturnValue().Set(Number::New(isolate, result));
}

然后使用 <node.h> 导出这些函数。

问题出在 rand() 函数中。代码编译(我在代码中包含了 stdlib),这是 binding.gyp:

{
  "targets": [
    {
      "target_name": "addon",
      "sources": [
        "addon/main.cc",
        "addon/utils.cc",
        "addon/modules/sum.cc"
      ]
    }
  ]
}

但是在运行时我得到了这个错误:

node: symbol lookup error: /xxx/build/Release/addon.node: undefined symbol: _ZL12ReturnResultiRKN2v820FunctionCallbackInfoINS_5ValueEEE

如果我不使用它就会消失 rand();

你像这样转发你的辅助函数:

static void ReturnResult(int result, const FunctionCallbackInfo<Value> &args);
//                       ^^^

然后像这样实现它:

static void ReturnResult(double result, const FunctionCallbackInfo<Value> &args)
//                       ^^^^^^

因此,请修正任何一个错误,您的问题就会消失。


您可能想了解 demangler.com。那会告诉您链接器错误中的损坏符号对应于:

ReturnResult(int, v8::FunctionCallbackInfo<v8::Value> const&)

我想这会有所帮助。