我正在尝试通过我的同事编写的代码为节点创建自己的c ++插件。
它编译为file.node
,然后当我尝试在节点中使用它时崩溃。
我试图预构建库,然后使用library.dylib
并通过node-gyp一起构建它。
这两种方法都会在运行时进行编译并引发错误。
我还能做什么?
我正在研究OSX Mojave。
我已检查:
整个错误:
dyld: lazy symbol binding failed: Symbol not found:
__ZN3mds7computeERNSt3__16vectorINS1_IdNS0_9allocatorIdEEEENS2_IS4_EEEE
Referenced from: /.../node_folder/build/release/file.node
Expected in: flat namespace
我的gyp文件:
{
"targets": [
{
"target_name": "name",
"sources": ["file.cc"],
"include_dirs": [
"<!(node -e \"require('nan')\")",
"/path/to/cpp/src/"
],
"link_settings": {
"libraries": ["-L/path/to/dylib/directory"]
},
"libraries": ["-L/path/to/dylib/directory"]
}
]
}
我的package.json
{
...
"dependencies": {
"nan": "^2.12.1",
"node-gyp": "^3.8.0"
},
"scripts": {
"compile": "node-gyp rebuild",
"start": "node index.js"
},
"gypfile": true
}
我的绑定文件:
#include <nan.h>
#include <iostream>
#include <my_header_file.h>
using namespace v8;
NAN_METHOD(compute)
{
if (!info[0]->IsArray())
{
Nan::ThrowTypeError("Argument myst be an array");
return;
}
...
std::vector<std::vector<double>> vector;
... (filling the vector with data)
//static std::vector<std::vector<double>> compute(std::vector<std::vector<double>> & distances_matrix);
mds::compute(vector);
}
NAN_MODULE_INIT(Initialize)
{
NAN_EXPORT(target, compute);
}
NODE_MODULE(addon, Initialize);
答案 0 :(得分:2)
我看到您正在将标题导入#include <my_header_file.h>
。
如果您要从自定义类中为NAN_METHOD调用方法,则需要内联调用它,否则编译器将不知道在哪里查找。
运行“ c ++ filt(缺少符号)”进行分解,看看需要在何处调用它
示例
代替method()
使用Class::method()
已删除的丢失符号为mds::compute(std::__1::vector<std::__1::vector<double, std::__1::allocator<double> >, std::__1::allocator<std::__1::vector<double, std::__1::allocator<double> > > >&)
答案 1 :(得分:1)
我已经解决了 https://github.com/nodejs/node-gyp/issues/1380,
<块引用>缺少符号的名称表明它没有使用 C 链接。
我只是在头文件中添加了extern "C"
extern "C" double add(double a ,double b);
答案 2 :(得分:0)
您应该转到根文件夹,依次依次rm -rf node_modules/
和npm install
。