若只是将 c++ 代码编译成某个系统下的动态链接库,或许并不会出现这么多问题,当然咯,也就不会有这篇文章的出现了。
那为什么非要将 c++ 编译成 *.node 文件呢?这是个好问题啊!其实,我在做之前,也曾思量过这个问题。
很显然,回答这个问题的答案很是宽泛。
那么,既是如此,我便开始编译 c++ 代码为 *.node 文件了。

*.gyp 文件骨架:
{
"targets": [
{
"target_name": "编译后的最终名称",
"sources": [
"c++源码文件相对路径",
],
"include_dirs": [
"<!@(node -p \"require('node-addon-api').include\")",
"../include"
],
"defines": [
"NAPI_CPP_EXCEPTIONS"
],
"msvs_settings": {
"VCCLCompilerTool": {
"ExceptionHandling": 1
}
}
}
]
}
package.json 文件:
{
"name": "项目名称",
"version": "1.0.0",
"description": "项目描述",
"main": "c++入口文件",
"scripts": {
"install-node": "node-gyp rebuild"
},
"dependencies": {
"node-addon-api": "^6.1.0"
},
"devDependencies": {
"node-gyp": "^10.3.1"
}
}
可当我使用以下命令进行编译时,却出现了错误:
npx node-gyp rebuild --msvs_version=2022 --arch=x64

既然说在我这台电脑找不到任何的 Windows SDK,这我就纳闷了。

我可是早在研究浏览器那会儿,便下载了 Windows SDK 了呀!
随后,我很是不解,便将问题丢给老伙计 chatGPT,毕竟 AI 可比人工去网上搜索找资料要强得多咯!
可 chatGPT 竟让我去注册表添加 KitsRoot10。
但当我按照提示点开注册表的,却发现有了这一项。

既然已经设置了注册表,那么,便继续寻求 chatGPT 解答。

我甚至开始怀疑会不会是 node-gyp 版本的问题呢?

随后,我将 build 文件夹删除掉,并清除 .gyp-cache 缓存文件。


出现这样的问题,就是 *.gyp 文件没把 node-addon-api 引入,导致无法在 c++ 文件中 #include。

"include_dirs": [
"<!@(node -p \"require('node-addon-api').include\")",
"../include"
],
索性,最终问题解决了,编译也成功了。



至于在 node.js 怎么调用,就留给下一篇文章了。


2024-09-27 08:26:43 +0800 +0800