自定义node.js插件可以被创build但不能包含

我正在编写一个由C ++与C程序混合的自定义node.js插件。

addon.cc由类似的东西组成

#define BUILDING_NODE_EXTENSION #include <node.h> #include <node_buffer.h> using namespace v8; using namespace node; /* other logic and function... */ Handle<Value> RunCallback(const Arguments& args) { HandleScope scope; Local<Value> buffer1 = args[0]; size_t size = Buffer::Length(buffer1->ToObject()); char* bufferdata = Buffer::Data(buffer1->ToObject()); /* some logic written in C style ... */ Local<Function> cb = Local<Function>::Cast(args[1]); const unsigned argc = 1; Local<Value> argv[argc] = { Local<Value>::New(String::New(outputdata, outputSize)) }; cb->Call(Context::GetCurrent()->Global(), argc, argv); return scope.Close(Undefined()); } void Init(Handle<Object> target) { target->Set(String::NewSymbol("runCallback"), FunctionTemplate::New(RunCallback)->GetFunction()); } NODE_MODULE(addon, Init) 

它还包括其他.cc文件,所以wscript是这样的:

 srcdir = '.' blddir = 'build' VERSION = '0.0.1' def set_options(opt): opt.tool_options('compiler_cxx') def configure(conf): conf.check_tool('compiler_cxx') conf.check_tool('node_addon') def build(bld): obj = bld.new_task_gen('cxx', 'shlib', 'node_addon') obj.target = 'addon' obj.source = ['addon.cc', 'otherFiles.cc'] 

当我运行node-waf configure时,它显示:

 Checking for program g++ or c++ : /usr/bin/g++ Checking for program cpp : /usr/bin/cpp Checking for program ar : /usr/bin/ar Checking for program ranlib : /usr/bin/ranlib Checking for g++ : ok Checking for node path : not found Checking for node prefix : ok /usr/local 'configure' finished successfully (0.169s) 

当我运行node-waf构build时,它显示:

 Waf: Entering directory `/path/build' [ 1/25] cxx: addon.cc -> build/Release/addon_1.o ... list of file ... build/Release/list of file -> build/Release/addon.node Waf: Leaving directory `/path/build' 'build' finished successfully (0.544s) 

但是当我在节点REPL中尝试以下内容时,它显示:

 var addon = require("./build/Release/addon"); Error: Unable to load shared library /path/build/Release/addon.node at Object..node (module.js:472:11) at Module.load (module.js:348:31) at Function._load (module.js:308:12) at Module.require (module.js:354:17) at require (module.js:370:17) at repl:1:13 at REPLServer.eval (repl.js:80:21) at repl.js:190:20 at REPLServer.eval (repl.js:87:5) at Interface.<anonymous> (repl.js:182:12) 

这很奇怪。 我已经检查过该文件应该与系统架构匹配:

 $ file build/Release/addon.node build/Release/addon.node: Mach-O 64-bit bundle x86_64 $ file `which node` /usr/local/bin/node: Mach-O 64-bit executable x86_64 

通过查看nm,它显示以下内容:

 nm ./build/Release/addon.node 0000000000011880 s GCC_except_table30 0000000000001160 t _Init U __Unwind_Resume_or_Rethrow U ___bzero U ___gxx_personality_v0 0000000000013220 D _addon_module U _free 0000000000013600 D _lsfmeanTbl 0000000000013420 D _memLfTbl U _memcpy U _memmove U _puts U _realloc 0000000000011950 s _ssqEn_win.2272 000000000001341c D _stMemLTbl 00000000000132e0 D _state_frgqTbl 00000000000132c0 D _state_sq3Tbl U dyld_stub_binder (... many are omitted ...) 

可能的原因是什么? 难道我不能把C文件和C ++文件结合起来编译吗? 我应该删除所有的malloc / realloc / free吗? 或者其他可能的原因?

将init()和NODE_MODULEmacros的定义封装在extern "C"以避免导出符号的名称C ++改变:

 extern "C" { void Init(Handle<Object> target) { target->Set(String::NewSymbol("runCallback"), FunctionTemplate::New(RunCallback)->GetFunction()); } NODE_MODULE(addon, Init) } 

通过使用node.js版本> = 0.7.6。 问题已经解决了。 另外,它还有更多的debugging信息。