在C ++中调用函数时未定义的符号随机字符添加

时间:2016-08-08 13:51:03

标签: c++ node.js v8

在NodeJS中,我正在构建C语言中共享对象的接口。我有以下代码:

#include <node.h>
#include "libcustom_encryption.h"

namespace demo {

    using v8::Exception;
    using v8::FunctionCallbackInfo;
    using v8::Isolate;
    using v8::Local;
    using v8::Number;
    using v8::Object;
    using v8::String;
    using v8::Value;

    //
    //  This is the implementation of the "add" method
    //  Input arguments are passed using the
    //  const FunctionCallbackInfo<Value>& args struct
    //
    void DeviceGetVersion(const FunctionCallbackInfo<Value>& args)
    {
        char ver[10] = {0};
        unsigned int ver_size = 0;

        device_get_version(ver, ver_size);

        Isolate* isolate = args.GetIsolate();

        //
        //  1.  Save the value in to a isolate thing
        //
        Local<Value> str = String::NewFromUtf8(isolate, "Test");

        //
        //  2.  Set the return value (using the passed in
        //      FunctionCallbackInfo<Value>&)
        //
        args.GetReturnValue().Set(str);
    }


    void Init(Local<Object> exports)
    {
        NODE_SET_METHOD(exports, "devicegetversion", DeviceGetVersion);
    }

    NODE_MODULE(addon, Init)
}
  • node-gyp configure:正常工作
  • node-gyp build:正常工作
  • LD_LIBRARY_PATH=libs/ node index.js:无效

我收到以下错误

node: symbol lookup error: /long_path/build/Release/app.node: undefined symbol: _Z18device_get_versionPcS_Phj

调用函数时,它会被添加前缀并附加随机字符。我假设这是随机数据是来自内存的一些噪音。它接缝好像大小刹车调用功能更大然后它应该。

我不喜欢混合C ++和C,我很想得到关于正在发生的事情的解释。

技术规格:

  • 海湾合作委员会版本:gcc版本4.8.5 20150623(红帽4.8.5-4)(GCC)
  • NodeJS版本:v6.2.0

1 个答案:

答案 0 :(得分:2)

  

调用该函数,它被预先添加并附加随机字符

它被称为 在C ++中发生的name mangling

这里的实际错误是编译模块无法链接到函数device_get_version()

您可能的行动:

  • device_get_version的实施添加到您的模块
  • 正确链接此功能
  • 只需删除该行,错误就会消失

UPD。
 device_get_version实际上可能是一个C函数,它被视为一个C ++函数(你可以通过它具有的错误名称来告诉它)。 确保您的函数声明为

extern "C" {
    void device_get_version(...);
}