【问题标题】:NodeJS module compilationNodeJS 模块编译
【发布时间】:2022-01-13 00:07:18
【问题描述】:

我有一个使用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' ],
    }
  ]
}

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

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

【问题讨论】:

    标签: node.js makefile g++ node-gyp node-addon-api


    【解决方案1】:

    如果您的 Node 插件使用您必须构建的第 3 方库,则可以通过三种方式进行:

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

    【讨论】:

    • 这越来越好 * 我的方法是你在第一个案例中描述的。 * 你能把第二个扩大一点吗?你提到的项目是开源的?如果是这样,请您链接它们。 * Node核心团队不情愿的原因是什么,欢迎再次链接。
    • 然后只需创建一个Makefile 与:project/lib/binding/addon.node: project/src/*.cc node-gyp configure &amp;&amp; node-gyp build
    • 我不明白你的最后评论。但现在我至少能够包含标题,所以我想我可以继续使用最初的方法。
    • 我会把它添加到另一个答案中
    【解决方案2】:

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

    要构建它,您应该调用 npx node-gyp build 如果node_modules/.bin在你的路径中,则只是node-gyp build

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

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

    如果您想从 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,我是它的当前维护者。

    【讨论】:

    • 这个问题和this什么有关。 kaldi 项目使用 ./configure 生成一些 makefile,如果我将我的代码作为 src/ 模块的子文件夹,它们就可以工作。如果我可以扩展它们以编译与节点兼容的库,我就完成了。
    • 我会发布另一个答案,我认为这可能对其他人有用:-)
    猜你喜欢
    • 1970-01-01
    • 2015-09-01
    • 1970-01-01
    • 2021-04-23
    • 1970-01-01
    • 2020-01-23
    • 2011-05-03
    • 2016-05-29
    • 2021-06-04
    相关资源
    最近更新 更多