2012-07-03 7 views
6

Ho scritto un addon nativo per node.js, lo ho compilato con MSVC++ senza node-gyp e l'ho usato con successo sul nodo REPL e in un'applicazione. Sto usando il nodo x64 e sto compilando un addon x64. Sto cercando di ottenere la cosa da costruire con node-gyp. Ho ottenuto node-gyp per generare una soluzione di Visual Studio e compilarlo, ma l'addon che viene fuori non funziona. L'unico errore che ottengo è questo:Impossibile caricare l'addon nativo di node.js se compilato con node-gyp, ma funziona con 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) 

Quando eseguo uno script che tenta di caricare l'addon, ottengo questo:

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) 

Ho imparato che dlopen ha qualcosa a che fare con il caricamento librerie dinamiche su Linux, ma non riesco a trovare alcuna informazione utile rilevante per il nodo (in particolare, su Windows.). Questo addon richiede alcune DLL di terze parti, ma sono sul mio percorso, e ancora una volta, l'addon funziona bene quando lo compilo senza node-gyp.

Cosa devo fare per capire come farlo funzionare?

risposta

14

Si è scoperto che il problema stava nel mio uso della macro NODE_MODULE. Ho avuto qualcosa di simile:

NODE_MODULE(SomeAddonName, Init) 

Ma la mia binding.gyp avuto questo:

"target_name": "totallyDifferentName", 

Si scopre che nome_destinazione in binding.gyp deve essere uguale al nome del modulo (il primo argomento di NODE_MODULE).

Grazie a @TooTallNate per avermi aiutato con questo!

+0

Ah, sto avendo lo stesso identico problema! E questo, naturalmente, lo ha risolto. Grazie. :-) – blazs