0

我有一个使用node-addon-api接口的节点添加模块。

{
  "targets": [
    {
      "target_name": "mod",
      "sources": [
        "./src/index.cpp",
        ...
      ],
      "include_dirs": [
        ...,
        "<!@(node -p \"require('node-addon-api').include\")"
      ],
      "libraries": [
        ...,
        "/usr/lib/libgfortran.so.5"
      ],
      'defines': [ 'NAPI_DISABLE_CPP_EXCEPTIONS' ],
    }
  ]
}

这将生成一个我可以从 NodeJS 加载的模块require('./mod.node')

从 makefile 进行此编译的步骤是什么?

4

2 回答 2

1

如果您的 Node 插件使用您必须构建的 3rd 方库,则可以通过三种方式来实现:

  • 创建一个Makefile启动您的第 3 方库和 Node 插件的编译(使用我的其他答案中的命令),然后使用librariesgyp 文件的部分将您的插件与该库链接 - 这是最简单的选择
  • 将 3rd 方库完全转换为 gyp - 这是最好的选择 - 我维护了许多 Node 插件,并为它们创建了 gyp 构建系统(我在你的 gyp 中看到了 Fortran,所以你可能知道netcdfand hdf5) - 但它是相当复杂
  • 将您的 Node 插件转换为经典插件Makefilecmake- 这是迄今为止最难的,并且不会立即产生任何好处 - 您必须node-gyp从头开始重新实现 - 即使是 Node 的核心团队也不愿意这样做
于 2022-01-12T09:55:50.937 回答
0

通常,您不会将 aMakefile与 a 一起使用,node-gyp因为gyp它本身就是一个成熟的品牌。

要构建它,您应该调用 npx node-gyp build 或者只是node-gyp buildnode_modules/.bin您的路径中

您还应该将其安装为项目依赖项:npm i --save node-gyp

如果你yeoman曾经走到这一步,它已经自动为你构建了一次,而不需要node-gyp- 因为它包含在它的包中。您可以从中调用它的副本,/usr/lib/node_modules/yo/node_modules/node-gyp/bin/node-gyp.js但通常您应该将其安装为项目的依赖项。

如果你想从 a 构建这个模块Makefile,只需添加:

project/lib/binding/addon.node: project/src/*.cc project/src/*.h
  project/node_modules/.bin/node-gyp configure
  project/node_modules/.bin/node-gyp build -j max

在这种情况下,您的所有用户都必须在从npm.

如果您想通过 将其作为二进制文件分发npm,我还建议您查看@mapbox/node-pre-gyp哪个可以替代node-gyp并自动从 Amazon S3 下载预构建的二进制文件。如果你更喜欢使用 Github Actions / Packages,你应该看看@mmomtchev/node-pre-gyp-github我是当前的维护者。

于 2022-01-11T20:58:44.930 回答