Javascript node.js c++;将多个cc文件扩展为一个模块

Javascript node.js c++;将多个cc文件扩展为一个模块,javascript,c++,node.js,Javascript,C++,Node.js,我正在使用node.js来评估一个基于complexec的库如何与node.js连接。该lib使用数据库执行多个操作,nodejs将调用该函数并通过restapi返回结果 当我从侧面看例子时,我遇到了一个问题: 我正在尝试基于两个cc文件构建一个插件: 附件1.c: #define BUILDING_NODE_EXTENSION #include <node.h> using namespace v8; Handle<Value> Add(const Argument

我正在使用node.js来评估一个基于complexec的库如何与node.js连接。该lib使用数据库执行多个操作,nodejs将调用该函数并通过restapi返回结果

当我从侧面看例子时,我遇到了一个问题:

我正在尝试基于两个cc文件构建一个插件:

附件1.c:

#define BUILDING_NODE_EXTENSION
#include <node.h>

using namespace v8;

Handle<Value> Add(const Arguments& args) {
  HandleScope scope;

  if (args.Length() < 2) {
    ThrowException(Exception::TypeError(String::New("Wrong number of arguments")));
    return scope.Close(Undefined());
  }

  if (!args[0]->IsNumber() || !args[1]->IsNumber()) {
    ThrowException(Exception::TypeError(String::New("Wrong arguments")));
    return scope.Close(Undefined());
  }

  Local<Number> num = Number::New(args[0]->NumberValue() +
      args[1]->NumberValue());
  return scope.Close(num);
}

void Init(Handle<Object> exports) {
  exports->Set(String::NewSymbol("add"),
      FunctionTemplate::New(Add)->GetFunction());
}

NODE_MODULE(addon, Init)
调用node.gyp configure build结束时显示以下错误消息:

  CXX(target) Release/obj.target/addon/addon2.o
  SOLINK_MODULE(target) Release/addon.node
duplicate symbol __Z4InitN2v86HandleINS_6ObjectEEE in:
    Release/obj.target/addon/addon1.o
    Release/obj.target/addon/addon2.o
ld: 1 duplicate symbol for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [Release/addon.node] Error 1
gyp ERR! build error 
gyp ERR! stack Error: `make` failed with exit code: 2
gyp ERR! stack     at ChildProcess.onExit (/opt/local/lib/node_modules/node-gyp/lib/build.js:267:23)
gyp ERR! stack     at ChildProcess.EventEmitter.emit (events.js:98:17)
gyp ERR! stack     at Process.ChildProcess._handle.onexit (child_process.js:797:12)
gyp ERR! System Darwin 13.1.0
gyp ERR! command "node" "/opt/local/bin/node-gyp" "configure" "build"
gyp ERR! cwd /Applications/MAMP/htdocs/nodejs/test2
gyp ERR! node -v v0.10.26
gyp ERR! node-gyp -v v0.13.0
gyp ERR! not ok 
我希望你们中的任何人都能对如何解决这个问题有所启发


提前感谢。

问题很清楚:在两个翻译单元(源文件)中都有一个名为
Init
的函数。在构建单个模块时,应该只有一个
Init
函数

解决此问题的简单方法是删除一个
Init
函数,并在剩余的
Init
函数中“注册”两个
add
del
名称


解决方案:在one源文件中,您只有函数
Init
,并声明缺少的
Add
Del
函数(即,您制作函数原型):

//声明函数原型
句柄添加(常量参数和参数);
句柄Del(常量参数和参数);
//唯一的初始化函数
void Init(句柄导出){
导出->设置(字符串::NewSymbol(“添加”),
FunctionTemplate::New(Add)->GetFunction();
导出->设置(字符串::NewSymbol(“del”),
FunctionTemplate::New(Del)->GetFunction();
}
节点_模块(加载项,初始化)

实际上,您现在可以将其作为一个单独的源文件。

从您的实现中,我可以看到您正在尝试实现两个不同的模块add和del

js提供了不同类型的插件模式,如


在我看来,您试图实现的是文件扩展名
.c
.cc
?你的问题还不清楚,但是如果没有init函数,我怎么能比init方法“del”更有效呢?我试图将其重命名为init2,但出现了相同的错误。不,这也不起作用。如果我将del初始化移到addon1.c的init函数中,我会得到一个未计算标识符“del”的错误。将init函数移动到addon2.c会产生相同的错误,但是现在对于标识符'Add',感谢我自己找到了这个解决方案。显然,nodejs的人并不打算将同一模块中的函数拆分为单独的文件。嗨,不,我在寻找一种方法,使一个模块(插件)有两个方法(del,add),并在单独的cpp文件中实现每个方法。是的,这是可能的。但不是你按照最初的帖子尝试实现的方式。如果你仔细查看整个页面,你肯定会找到答案。
{
  "targets": [
    {
      "target_name": "addon",
      "sources": ["addon1.cc", "addon2.cc"]
    }
  ]
}
  CXX(target) Release/obj.target/addon/addon2.o
  SOLINK_MODULE(target) Release/addon.node
duplicate symbol __Z4InitN2v86HandleINS_6ObjectEEE in:
    Release/obj.target/addon/addon1.o
    Release/obj.target/addon/addon2.o
ld: 1 duplicate symbol for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [Release/addon.node] Error 1
gyp ERR! build error 
gyp ERR! stack Error: `make` failed with exit code: 2
gyp ERR! stack     at ChildProcess.onExit (/opt/local/lib/node_modules/node-gyp/lib/build.js:267:23)
gyp ERR! stack     at ChildProcess.EventEmitter.emit (events.js:98:17)
gyp ERR! stack     at Process.ChildProcess._handle.onexit (child_process.js:797:12)
gyp ERR! System Darwin 13.1.0
gyp ERR! command "node" "/opt/local/bin/node-gyp" "configure" "build"
gyp ERR! cwd /Applications/MAMP/htdocs/nodejs/test2
gyp ERR! node -v v0.10.26
gyp ERR! node-gyp -v v0.13.0
gyp ERR! not ok 
// Declare function prototypes
Handle<Value> Add(const Arguments& args);
Handle<Value> Del(const Arguments& args);

// The one and only initialization function
void Init(Handle<Object> exports) {
  exports->Set(String::NewSymbol("add"),
      FunctionTemplate::New(Add)->GetFunction());
  exports->Set(String::NewSymbol("del"),
      FunctionTemplate::New(Del)->GetFunction());
}

NODE_MODULE(addon, Init)