Node.js原生插件:node_api.h文件在哪里?

21

我正在尝试为Node.js创建本地插件,当我包含

#include <napi.h>

VS Code的Intelli Sense显示无法检测node_api.h的位置(它由napi.h包含)。

node-gyp build能够正常工作并编译。但我不理解这个头文件在系统中的位置,以及node-gyp从哪里获取它?我需要将路径添加到Intelli Sense选项中,并更好地了解构建过程。

我正在尝试使用这个代码示例

5个回答

16

我已经在C盘进行了全盘搜索(我的操作系统是Windows 10),发现头文件node_api.h位于以下位置

C:\Users\<UserName>\AppData\Local\node-gyp\Cache\<NodeVersion>\include\node

还有其他标题,例如v8.h

如果您删除该文件夹,node-gyp build 将不再起作用。node-gyp configure 会再次下载所有标题并恢复上述提到的文件夹。


在我的电脑上,它位于 C:/Users/<user>/.node-gyp/<version>/include/node - merlin.ye
3
你是如何处理Intellisense而不使用硬编码<user>路径的? - itslittlejohn
工作得很好,但想知道如何避免硬编码用户名和节点版本。 - Chris
附注:在Linux上,如果使用默认的Node设置进行全局安装,则它们位于:“/usr/include/node”中。 - Jodo

1
我知道这有点老了,但这是我避免硬编码的解决方法。如果你不使用vscode,这可能会更有帮助。我使用下面的函数为clangd生成一个compile_flags.txt文件。 在使用node-gyp构建之后,应该会有一个名为config.gypi的文件,它类似于json。有一个名为nodedir的属性,应该指向包含路径。下面是一个可以帮助找到这个属性的函数: 这应该是平台无关的。

const fsp = require('fs/promises');
const { existsSync, readFileSync } = require('fs');
const assert = require('node:assert');

const findnodeapih = () => {
    assert(existsSync("./build"), "Haven't built the application once yet. Make sure to build it");
    const dir = readFileSync("./build/config.gypi", 'utf8');
    const nodedir_line = dir.match(/"nodedir": "([^"]+)"/);
    assert(nodedir_line, "Found no matches")
    assert(nodedir_line[1]);
    console.log("node_api.h found at: ", nodedir_line[1]);
    return nodedir_line[1]+"/include/node";
};

1
如果您正在使用微软的ms-vscode.cpptools扩展程序,那么您只需要将napi使用的头文件路径添加到VSCode的包含路径中即可: 将光标移动到带有错误的include行上->选择“快速修复”->应该会有一个设置包含路径选项的选项(确切的命名因语言而异)->新标签页打开,在“包含路径”下添加路径。
如RussCoder所述,头文件位于appdata中。
或者请参见:https://code.visualstudio.com/docs/cpp/customize-default-settings-cpp

0

11
require('node-addon-api').includenode_modules/node-addon-apinode_modules/node-addon-api/index.js 中是同一个文件夹。有napi.h但没有node_api.h - RussCoder

0
在 macOS 上,我发现(假设已安装 Node 版本 16.17.0),我的 node_api.h 存储在 ~/.node-gyp/16.17.0/include/node/node_api.h。 因此,我可以通过路径 ~/.node-gyp/16.17.0/include/** 包含它。
因此,为了获得 VS Code 中适当的智能感知,我编辑了此配置文件。 相当多的字段已经由默认设置为我设置好,但是关于这个问题,我所更改的就只是添加了一个额外的路径到 includePath.vscode/c_cpp_properties.json:
{
    "configurations": [
        {
            "name": "Mac",
            "includePath": [
                "${workspaceFolder}/**",
                "~/.node-gyp/16.17.0/include/**"
            ],
            "defines": [],
            "macFrameworkPath": [
                "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks"
            ],
            "compilerPath": "/usr/bin/clang",
            "cStandard": "c17",
            "cppStandard": "c++17",
            "intelliSenseMode": "macos-clang-arm64"
        }
    ],
    "version": 4
}

您可以通过更改路径来避免硬编码版本:

~/.node-gyp/**

......但请注意,如果您安装了多个版本的node,您将最终包含重复的头文件(并且会有糟糕的体验)。因此,您可以手动设置符号链接到~/.node-gyp/current,该链接指向您正在使用的任何版本的node,然后将路径设置为~/.node-gyp/current/**。或者,只需随意指向一个已安装的node版本,并希望头文件在不同版本之间没有太大变化...!


我在我的Homebrew安装的Node 20上的macOS 13.4上运行了npm install -g node-gyp && node-gyp install命令,但是我仍然看不到~/.node-gyp目录。 - user3064538

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接