dyld:惰性符号绑定失败:未找到符号。预期于:平面名称空间

时间:2019-02-08 09:54:23

标签: c++ node.js node-gyp

我正在尝试通过我的同事编写的代码为节点创建自己的c ++插件。

它编译为file.node,然后当我尝试在节点中使用它时崩溃。

我试图预构建库,然后使用library.dylib并通过node-gyp一起构建它。

这两种方法都会在运行时进行编译并引发错误。

我还能做什么?

我正在研究OSX Mojave。

我已检查:

  

How to include c++ libraries so that node-gyp can link?

     

dyld: lazy symbol binding failed

整个错误:

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

3 个答案:

答案 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