Не удается загрузить собственный аддон node.js при сборке с помощью node-gyp, но он работает при сборке с помощью Visual Studio.

Я написал собственный аддон для node.js, скомпилировал его с помощью MSVC++ без node-gyp и успешно использовал его на узле REPL и в приложении. Я использую узел x64 и компилирую надстройку x64. Я пытаюсь заставить это строить с помощью node-gyp. Я получил node-gyp для создания решения Visual Studio и его компиляции, но выходящий аддон не работает. Единственная ошибка, которую я получаю, это:

Error: The specified procedure could not be found.

    at Object.Module._extensions..node (module.js:480:11)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Module.require (module.js:362:17)
    at require (module.js:378:17)
    at repl:1:13
    at REPLServer.self.eval (repl.js:111:21)
    at rli.on.e (repl.js:260:20)
    at REPLServer.self.eval (repl.js:118:5)
    at Interface.<anonymous> (repl.js:250:12)

Когда я запускаю скрипт, который пытается загрузить аддон, я получаю следующее:

module.js:480
  process.dlopen(filename, module.exports);
          ^
Error: The specified procedure could not be found.

    at Object.Module._extensions..node (module.js:480:11)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Module.require (module.js:362:17)
    at require (module.js:378:17)
    at Object.<anonymous> (c:\blah\testheaders.js:1:75)
    at Module._compile (module.js:449:26)
    at Object.Module._extensions..js (module.js:467:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)

Я узнал, что dlopen как-то связан с загрузкой динамических библиотек в Linux, но не могу найти никакой полезной информации, относящейся к узлу (в частности, в Windows). Этот аддон требует некоторых сторонних dll, но они есть на моем пути, и опять же, аддон работает нормально, когда я компилирую его без node-gyp.

Что мне нужно сделать, чтобы понять, как заставить это работать?


person Jake    schedule 03.07.2012    source источник


Ответы (1)


Оказалось, что проблема заключалась в использовании мною макроса NODE_MODULE. У меня было что-то вроде этого:

NODE_MODULE(SomeAddonName, Init)

Но у моего binding.gyp было это:

"target_name": "totallyDifferentName",

Получается, что target_name в binding.gyp должно совпадать с именем модуля (первый аргумент NODE_MODULE).

Спасибо @TooTallNate за помощь в этом!

person Jake    schedule 05.07.2012
comment
О, у меня точно такая же проблема! И это, конечно, решало. Спасибо. :-) - person blazs; 17.07.2014