首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过n-api在nodejs中使用多个cpp文件

通过n-api在nodejs中使用多个cpp文件
EN

Stack Overflow用户
提问于 2018-07-20 21:19:13
回答 1查看 262关注 0票数 0

我是n-api模块的新手。在组合两个cpp文件时,在执行node-gyp configure build时得到以下错误。

代码语言:javascript
复制
b.obj : error LNK2005: _register_a_ already defined in a.obj [e:\democppmore\build\a.vcxproj]
b.obj : error LNK2005: "struct napi_value__ * __cdecl Init(struct napi_env__ *,struct napi_value__ *
)" (?Init@@YAPEAUnapi_value__@@PEAUnapi_env__@@PEAU1@@Z) already defined in a.obj [e:\democppmore\bu
ild\a.vcxproj]

我怀疑这是由于napi_value Init()存在于两个不同的cpp代码中。如果是这样,我们如何克服它&我们的gyp & js文件需要如何编写?

我有以下代码:

代码语言:javascript
复制
a.cc
-------
#include <node_api.h>
#include <assert.h>

napi_value Method(napi_env env, napi_callback_info info) {
//some code
}

#define DECLARE_NAPI_METHOD(name, func)                          \
  { name, 0, func, 0, 0, 0, napi_default, 0 }

napi_value Init(napi_env env, napi_value exports) {
  napi_status status;
  napi_property_descriptor desc = DECLARE_NAPI_METHOD("hello", Method);
  status = napi_define_properties(env, exports, 1, &desc);
  assert(status == napi_ok);
  return exports;
}

NAPI_MODULE(NODE_GYP_MODULE_NAME, Init)
-----------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------

binding.gyp
--------------
{
  "targets": [
    {
      "target_name": "module",
      "sources": [ 
        "./src/a.cc",
        "./src/b.cc" ]
    }
}

--------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------
#include <node_api.h>
#include <assert.h>
#include <stdio.h>
napi_value Add(napi_env env, napi_callback_info info) {
//some code here
}

#define DECLARE_NAPI_METHOD(name, func)                          \
  { name, 0, func, 0, 0, 0, napi_default, 0 }

napi_value Init(napi_env env, napi_value exports) {
  napi_status status;
  napi_property_descriptor addDescriptor = DECLARE_NAPI_METHOD("add", Add);
  status = napi_define_properties(env, exports, 1, &addDescriptor);
  assert(status == napi_ok);
  return exports;
}

NAPI_MODULE(NODE_GYP_MODULE_NAME, Init)

EN

回答 1

Stack Overflow用户

发布于 2021-02-04 13:22:35

我去参加聚会要迟到了。但由于这是唯一一篇与我正在努力解决的问题有关的帖子。幸运的是,我从官方的nodejs中找到了这个示例(您也可以找到其他示例),所以我想在这里分享它:https://github.com/nodejs/node-addon-examples/tree/master/6_object_wrap

编辑:我包含了我解决这个问题的方式:

Init方法中,我将descriptor声明为数组。napi_define_properties允许您传入一个方法数组。

代码:

代码语言:javascript
复制
// addon.cc
#include <node_api.h>

static napi_value Add()
{
    // Code
}

static napi_value Subtract()
{
    // Code
}

#define DECLARE_NAPI_METHOD(name, func) { name, 0, func, 0, 0, 0, napi_default, 0 }

static napi_value Init(napi_env env, napi_value exports)
{
    napi_status status;

    // Declare descriptor as an array
    napi_property_descriptor desc[] = { 
        DECLARE_NAPI_METHOD("subtract", Subtract),
        DECLARE_NAPI_METHOD("add", Add)
    };
    // Remeber to change the length of the descriptor as well
    status = napi_define_properties(env, exports, sizeof(desc) / sizeof(*desc), desc);
    assert(status == napi_ok);
    return exports;
}

NAPI_MODULE(NODE_GYP_MODULE_NAME, Init)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51443463

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档