engine.node: неопределенный символ: _ZTV6Config - PullRequest
0 голосов
/ 13 февраля 2020

Я написал свой первый Node.JS аддон N-Api, но он вылетает с журналом:

internal/modules/cjs/loader.js:718
  return process.dlopen(module, path.toNamespacedPath(filename));
                 ^

Error: /home/d/Projects/engine/build/Release/engine.node: undefined symbol: _ZTV6Config
    at Object.Module._extensions..node (internal/modules/cjs/loader.js:718:18)
    at Module.load (internal/modules/cjs/loader.js:599:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
    at Function.Module._load (internal/modules/cjs/loader.js:530:3)
    at Module.require (internal/modules/cjs/loader.js:637:17)
    at require (internal/modules/cjs/helpers.js:22:18)
    at Object.<anonymous> (/home/d/Projects/engine/index.js:1:78)
    at Module._compile (internal/modules/cjs/loader.js:689:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
    at Module.load (internal/modules/cjs/loader.js:599:32)

Ниже мой код:
wrapper.h :

#include <napi.h>
#include "types.hpp"

using namespace std;

class Config: public Napi::ObjectWrap<Config> {
    config_t _cfg;
public:
    explicit Config(const Napi::CallbackInfo &info);
    ~Config();
    static Napi::FunctionReference constructor;
    static Napi::Object Init(Napi::Env &env, Napi::Object &exports);

    config_t Get();
private:
    Napi::Value GetTimeAccuracy(const Napi::CallbackInfo &info);
    void SetTimeAccuracy(const Napi::CallbackInfo &info, const Napi::Value &value);
};

обертка. cc:

Config::Config(const Napi::CallbackInfo &info): Napi::ObjectWrap<Config>(info) {

}

Napi::Object Config::Init(Napi::Env &env, Napi::Object &exports) {
    // This method is used to hook the accessor and method callbacks
    Napi::Function func = DefineClass(env, "Config", {
        InstanceAccessor("timeAccuracy", &Config::GetTimeAccuracy, &Config::SetTimeAccuracy)
    });
    // Create a peristent reference to the class constructor. This will allow
    // a function called on a class prototype and a function
    // called on instance of a class to be distinguished from each other.
    constructor = Napi::Persistent(func);
    // Call the SuppressDestruct() method on the static data prevent the calling
    // to this destructor to reset the reference when the environment is no longer
    // available.
    constructor.SuppressDestruct();
    exports.Set("Config", func);
    return exports;
}

Napi::FunctionReference Config::constructor;

config_t Config::Get() {
    return _cfg;
}

Napi::Value Config::GetTimeAccuracy(const Napi::CallbackInfo &info) {
    Napi::Env env = info.Env();
    return Napi::Number::New(env, _cfg.time_accuracy);
}

void Config::SetTimeAccuracy(const Napi::CallbackInfo &info, const Napi::Value &value) {
    _cfg.time_accuracy = value.As<Napi::Number>().FloatValue();
}

двигатель. cc:

#include <napi.h>
#include "wrapper.h"

Napi::Object init(Napi::Env env, Napi::Object exports) {
    Config::Init(env, exports);
    return exports;
}

NODE_API_MODULE(engine, init);

binding.gyp :

{
    "targets": [{
        "cflags_cc": ["-std=c++17"],
        "include_dirs": [
            "<!@(node -p \"require('node-addon-api').include\")"
        ],
        "target_name": "engine",
        "sources": [
            "wrapper.cc",
            "engine.cc",
            "types.cpp",
        ],
        "defines": ["NAPI_DISABLE_CPP_EXCEPTIONS"]
    }]
}

Когда я перестраиваю проект, в нем нет ошибок. До того, как я написал простую Hello, World! , где я только что зарегистрировал функцию, которая печатает текст, и все работало хорошо. Но теперь я получаю ошибки (см. Выше), когда пытаюсь импортировать мой модуль как const engine = require('./build/Release/engine.node');.
Когда я получаю регистры моего модуля, но после Node.JS не удается найти реализацию Config.

Как это исправить?

1 Ответ

1 голос
/ 13 февраля 2020

_ZTV6Config - это искаженное имя для vtable for Config.

Заблуждение, что это на самом деле вызвано отсутствующей реализацией метода деструктора для Config.

Компилятор определяет виртуальную таблицу в том же модуле трансляции, что и определение деструктора.

...