将 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&)
我想这会有所帮助。
这只是问题的一个例子。
假设我有 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&)
我想这会有所帮助。