首页 > 解决方案 > 如何在 Node N-API 中使用第三方 dll、头文件和 lib 文件

问题描述

我已经获得了使用 c++ dll 的所有适当文件:

我正在尝试将Node N-API与给定文件一起使用,以便我们可以在节点服务器中使用这个 c++ dll。

问题是,当我尝试使用 node-gyp 构建时,它会引发以下错误:

LINK : fatal error LNK1181: cannot open input file 'lib\MathUtils.lib' [C:\Development\Github\node-thin-client\service\build\interface.vcxproj]

我使用的节点版本是:8.11.2

node-gyp 版本为:3.6.2

我的 binding.gyp 文件如下:

{
  "variables": {
    "dll_files": [
      "lib/MathUtils.dll"
    ]
  },
  "targets": [
    {
      "target_name": "interface",
      "sources": [
        "src/interface/interface.cpp"
      ],
      "include_dirs": [
        "<!@(node -p \"require('node-addon-api').include\")",
        "include"
      ],
      "dependencies": [
        "<!(node -p \"require('node-addon-api').gyp\")"
      ],
      "libraries": [
        "lib/MathUtils.lib"
      ],
      "cflags!": ["-fno-exceptions"],
      "cflags_cc!": ["-fno-exceptions"],
      "defines": ["NAPI_CPP_EXCEPTIONS"]
    }
  ]
}

标签: c++node.jsnode-gyp

解决方案


我遇到了类似的问题。我看到已经有一段时间了,但是如果其他人在构建链接到其他 dll 的节点插件时遇到这个问题,我就是这样做的:

您收到链接错误,因为项目文件是在./build项目下的目录中生成的,但您引用了./lib/MathUtils.lib. 如果您在 Visual Studio 中打开生成的 .sln 项目,您会看到问题。所以你可以这样做:

"libraries": [../lib/MathUtils.lib"] 

或者

"libraries": [ "<(module_root_dir)/lib/MathUtils.lib" ]

注意,首先相对路径上升一个目录。第二个会将完整路径放在项目的链接器行中。

同样对我来说,该variables部分没有将 dll 复制到发布目录,它似乎什么也没做。相反,我使用了副本部分:

     "conditions": [        
        ["OS==\"win\"", {
          "libraries": [ "<(module_root_dir)/tsflexnet/TSFlexnetCLib.lib" ],
          "copies": [
            {
              "destination": "<(module_root_dir)/build/Release/",
              "files": [ "<(module_root_dir)/tsflexnet/TSFlexnetCLib.dll" ]
            }
          ]
        }]
      ]

推荐阅读