使用自定义nodejs插件

我正在编写一个依赖OpenGL(glfw)的nodejs插件。它编译成功,但是当我尝试在节点中使用它时,出现错误The specified module could not be found

这是插件C ++代码中有问题的部分:

#include <glfw/glfw3.h>

if(glfwInit()) {
    printf("glfw init success");
}
else {
    printf("glfw init failed");
}

使用此插件,它会编译,但会导致节点错误。没有它,它就可以编译并运行。

这是我的binding.gyp:

{
  "targets": [
    {
      "target_name": "engine","sources": [
        "addon/addon.cc"
      ],"libraries": [
            "<(module_root_dir)/addon/lib/gl/glfw3dll.lib"
        ],"include_dirs": [
        "addon/lib","<!@(node -p \"require('node-addon-api').include\")"
      ],'defines': [ 'NAPI_DISABLE_CPP_EXCEPTIONS' ],}
  ]
}

以及插件文件结构:

addon
  lib
    glfw
      glfw3.dll
      glfw3.h
      glfw3.lib
      glfw3dll.lib
      glfw3native.h
      opengl32.lib
  addon.cc

编辑: 新的binding.gyp:

{
  "targets": [
    {
      "target_name": "engine","libraries": [
        "-lglfw3dll","-lopengl32","-L<module_root_dir)/lib/glfw","-Wl,-rpath,\$$ORIGIN/../../lib",],'<!@(node -p "require(\'node-addon-api\').include")'
      ],}
  ]
}
happy219 回答:使用自定义nodejs插件

我不确定这是否是您的问题,但是要说服加载程序在本地目录中加载特定的库可能有些棘手。我将此部分添加到binding.gyp的targets数组中。

诀窍是告诉链接程序寻找相对于$ORIGIN(插件所在的位置)的库。由于插件位于build/Release中,因此$ORIGINbuild/Release../../会带您回到模块根目录。

通过$ORIGIN和链接器的引用规则找到正确的方法来指定binding.gyp只是花了很多时间。 \$$ORIGIN导致$ORIGIN被嵌入节点插件中。

'conditions': [
    ['OS in "linux"',{
    # includes reference glfw3dll/glfw3dll.h,so
    'include_dirs': [
      '<!@(node -p "require(\'node-addon-api\').include")','<(module_root_dir)/'
    ],'libraries': [
        '-lglfw3dll','-L<(module_root_dir)/dir-for-glfw3dll/','-Wl,-rpath-link,<(module_root_dir)/dir-for-glfw3dll/',-rpath,\$$ORIGIN/../../dir-for-glfw3dll/'
    ],}]
]

(我将文件名更改为您的文件,并将其放在module_root_dir下的目录中。)

,

我设法使其与该binding.gyp文件一起使用:

{
  "targets": [
    {
      "target_name": "engine","sources": [
        "addon/addon.cc"
      ],"libraries": [
        "legacy_stdio_definitions.lib","msvcrt.lib","msvcmrt.lib","<(module_root_dir)/addon/lib/glfw/opengl32.lib","<(module_root_dir)/addon/lib/glfw/glfw3.lib"
        ],"include_dirs": [
        "addon/lib",'<!@(node -p "require(\'node-addon-api\').include")',],'defines': [ 'NAPI_DISABLE_CPP_EXCEPTIONS' ]
    }
  ]
}
,

以防万一其他人有同样的问题并最终出现在这里。插件所需的库在运行时必须在可及范围内,即使链接器设法找到它。

例如,如果这是在 Windows 上,并且您在构建/链接期间与 foo.lib 链接,则在运行期间,foo.dll 应该位于同一文件夹中(对我而言,它与 .node 在同一文件夹中工作)或在路径中的文件夹中。否则它不会被加载并且会抛出这个错误。在我看来,这是一个非常难以解释的错误。

此外,将库保存在与 .node 相同的文件夹中有助于隔离不同的架构构建和依赖项(x86、x64 等)。

本文链接:https://www.f2er.com/3001572.html

大家都在问