c++ - 如何在 Node N-API 中使用第三方 dll、头文件和 lib 文件
问题描述
我已经获得了使用 c++ dll 的所有适当文件:
- 头文件
- 库文件
- 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"]
}
]
}
解决方案
我遇到了类似的问题。我看到已经有一段时间了,但是如果其他人在构建链接到其他 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" ]
}
]
}]
]
推荐阅读
- apache-kafka - Zookeeper 错误:由于 java.io.IOException 导致会话 0x0 关闭的异常:Len 错误
- java - JAXB 2.1 实现 Comparable
对于生成的类 - mysql - 在 mysql/mariadb 中转换为已签名的 smallint
- java - RestTemplate 的 JVM 代理配置 - apache HttpClientBuilder
- java - 如何在地图中传输列表>
- ruby-on-rails - 在 Rails 应用程序中链接到主页上的最新帖子
- node.js - 如果未定义,则不插入更新值
- java - 如何锁定写入文件以使其他消费者无法使用
- powershell - 使用 Invoke-Webrequest 的无效正文
- java - 如何在java中返回多维arrayList?