我正在尝试转换一个在MacOS和Linux(尤其是Raspbian)上可以正常编译的项目,以便可以在Windows上编译。 (此处的完整代码:https://github.com/kshetline/rpi-acu-rite-temperature)
经过一番痛苦(就像我以某种方式安装的Node 12消失了,并在我不知情的情况下被Node 8取代了,在Windows C++上long
和int
都是32位的吗?真的!?),我终于将代码制作为使用node-gyp
和Visual Studio 2019进行编译,但Visual Studio设置以我不喜欢的方式固定到特定版本的Node。
这是我的CppProperties.json
文件:
{
"configurations": [
{
"inheritEnvironments": [
"msvc_x86"
],
"name": "x86-Debug",
"includePath": [
"${env.INCLUDE}",
"${env.LOCALAPPDATA}\\node-gyp\\Cache\\12.16.1\\include\\node\\**",
"${workspaceRoot}\\**"
],
"defines": [
"WIN32",
"_DEBUG",
"NAPI_CPP_EXCEPTIONS",
"UNICODE",
"_UNICODE",
"USE_FAKE_PIGPIO"
],
"intelliSenseMode": "windows-msvc-x86"
}
]
}
我不想在我的包含路径中放入特定版本的Node,但是我不知道如何在没有它的情况下使之工作。我什至不能通过使用
12.*
或12.**
使其适用于特定的主要版本的Node-通配符似乎不适用于我。我没有看到Windows环境变量可以让我使用诸如
${env.NODE_VERSION}
和AFAIK之类的东西,也没有VS预定义变量可以处理此问题。我可以使用自己的环境变量,但是必须手动更新,这是我要避免的事情。
Visual Studio是否可以通过某种方式编写更新脚本,例如执行
node --version
命令,从输出中去除前导字母“v”,然后将结果放入环境变量中?还有其他解决方案吗?
更新:
我通过从通用命令行应用程序开始更改了Visual Studio项目的设置,并且配置完全不同,根本没有
CppProperties.json
文件,但是问题仍然基本相同-现在我输入了$(LOCALAPPDATA)\node-gyp\Cache\12.16.1\include\node
改为配置对话框。
最佳答案
使用node-addon-api
的插件必须在编译时以节点的精确版本为目标。
这是因为N-API
本身是“版本化的”(具有一个数字宏NAPI_VERSION
,当前从1到5,加上特殊值NAPI_VERSION_EXPERIMENTAL=2147483647
)
如您所见,例如,在N-API Version Matrix中,版本4在节点v10.16.0中可用,但在某些较早的v10版本中不可用。
该插件是“复古链接”到node.exe(我不知道该技术的名称),而该链接是“延迟加载”链接。该技巧使插件可以使用主机可执行文件中的N-API
函数,即使它不是“node.exe”(因此使用win_delay_load_hook.cc
)也是如此。
至于CppProperties.json
文件,据我了解,它仅由Intellisence使用,与编译时使用的 header 无关。
您可以通过--target
命令的configure
选项,强制node-gyp使用特定版本的节点,该版本与计算机上安装的当前版本无关。
另一个有用的选项是--devdir
,它可以摆脱臭名昭著的(afaic)%localappdata%\node-gyp\Cache
根目录。
所有的node-gyp命令选项都是here
亲爱的node / node_gyp / N-API专家,请仔细阅读本文,不要犹豫,指出/解决该答案中的错误。
关于javascript - Visual Studio C++项目中node-gyp包含文件的自动更新路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60478768/