0

这只是问题的一个例子。

假设我有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()

4

1 回答 1

0

您向前声明您的辅助函数,如下所示:

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&)

我想这会有所帮助。

于 2022-01-15T22:26:49.943 回答