0

我目前正在开发一个用于 Node.Js 和 Electron 的本机节点模块,它需要额外的 dll 才能工作(以及 Linux 和 Mac 上的任何等价物)。我并不是真正的 C++ 开发,也没有在互联网上找到这个问题的解决方案,所以我可能需要你的一些支持:)

因此,当所有内容都存储在同一个(工作)目录中时,它工作得很好,但这不是你可以长期使用的东西。特别是当我将所有内容打包到一个可以用 NPM 加载的模块中时,带有它的 dll 的模块存储在一个子文件夹中,如“./node_modules/native-module/build/Release/adddon.node[或 dll]”。

我可以轻松地使用 require 包含该模块,但它不再找到任何 dll,因为如果我正确理解 C++ 行为,它只会在 PATH 和当前工作目录(执行 Electron 或 Node.js 的位置)中查找dll。

我的第一个解决方法是将 cwd 更改为所有 dll 所在的“Release”文件夹。但是当你喜欢使用 webpack 的热重载功能时,更改 cwd 会变得非常混乱,我将其用于开发目的。您总是必须检查 cwd 是否已经更改,它不再正确显示页面,我真的认为这不是这样做的方法。

所以我的问题是动态告诉节点模块dll存储在哪里的正确方法是什么?提前致谢。

PS:如果这很重要,我将使用 cmake-js 进行构建过程。

4

1 回答 1

1

我通过在运行时使用 node.js API 扩展 Path 环境变量来“修复”这个问题。至少在 Windows 下,本地 C++ 程序的默认行为是查找 Dll 的路径和 CWD。

这是我的代码,如果有人感兴趣:

let currentPath = process.env.Path; 
let dllDirectory = path.dirname( path.resolve(require.resolve('your-package-name/package.json'))) + `${path.sep}build${path.sep}Release` 
process.env.Path = currentPath + dllDirectory;
于 2020-06-22T17:28:29.307 回答