【HarmonyOS NAPI 深度探索4】安装开发环境(Node.js、C++ 编译器、node-gyp)

ops/2025/1/19 16:21:12/

【HarmonyOS NAPI 深度探索4】安装开发环境(Node.js、C++ 编译器、node-gyp)

要使用 N-API 开发原生模块,第一步就是配置好开发环境。虽然HarmonyOS Next中提供了DevEco-Studio一站式IDE,可以直接帮助我们完成开发环境的搭建,但是为了更深入的了解NAPI,我们用最原始的编译工具一步一步搭建编译环境。这个可能有点复杂和繁琐,下面我们一步一步来完成。我们需要安装以下工具:

  • Node.js:运行时环境
  • C++ 编译器:用来编译原生代码
  • node-gyp:构建工具,负责将 C++ 代码编译成可以运行的模块
安装 Node.js

Node.js 是开发 N-API 模块的核心工具。如果你的机器还没有安装 Node.js,可以按照以下步骤操作:

  1. 前往 Node.js 官方网站,下载适合你的系统版本的安装包。建议选择 LTS(长期支持)版本,因为它更加稳定。
  2. 根据安装向导进行安装,并确保在安装时勾选“Add to PATH”选项,这样你可以在命令行直接使用 nodenpm 命令。
  3. 安装完成后,打开终端或命令行,运行以下命令确认安装:
    node -v
    npm -v
    

应该能看到 Node.js 和 npm 的版本号:
在这里插入图片描述

安装 C++ 编译器

Node.js 的原生模块需要用 C++ 编写,因此必须安装一个 C++ 编译器。不同操作系统的安装方式略有不同:

  • Windows

    • 下载并安装 Microsoft Build Tools,这是 Visual Studio 的轻量版工具集。
    • 在安装过程中,选择“C++ build tools”,并确保安装了“MSBuild”和“Windows SDK”。
    • 安装完成后,运行以下命令检查是否安装成功:
      cl
      
      如果显示了版本号,你就准备好了。
  • macOS

    • macOS 自带 Xcode 工具链,你只需要安装命令行工具即可。运行以下命令安装:
      xcode-select --install
      
    • 按提示完成安装后,运行以下命令确认安装成功:
      clang --version
      
      这次可以看到 Clang 的版本信息
      在这里插入图片描述
  • Linux

    • 在 Linux 系统中,可以通过包管理器安装 GCC。以 Ubuntu 为例:
      sudo apt update
      sudo apt install build-essential
      
    • 安装完成后,运行以下命令确认:
      gcc --version
      
      如果返回版本号,就说明安装成功。
      后面以Mac环境为例,继续介绍后续步骤。
安装 node-gyp

node-gyp 是用来构建原生模块的工具,它可以将 C++ 代码编译成可以在 Node.js 中运行的模块。

  1. 通过 npm 安装 node-gyp:
    npm install -g node-gyp
    

在这里插入图片描述

  1. 安装完成后,运行以下命令验证:
    node-gyp -v
    
    这时可以看到 node-gyp 的版本号:
    在这里插入图片描述
配置 node-gyp

在使用 node-gyp 前,需要进行一些额外的配置。

  • Windows
    • 打开命令行,运行以下命令配置 Python 和 Visual Studio 工具链:
      npm config set python python3
      npm config set msvs_version 2019
      
  • macOS 和 Linux
    • 大多数情况下,你无需额外配置。如果遇到问题,可以尝试设置 Python 版本:
      npm config set python python3
      

手动配置执行后报错:
在这里插入图片描述

napi_88">安装 node-addon-api

node-addon-api 是构建 N-API 模块时的核心依赖,用于引用 napi.h
安装命令:

npm install node-addon-api

安装后,node-addon-api 的头文件路径会自动添加到项目的 node_modules 目录中。
在这里插入图片描述

测试开发环境

我们可以通过一个简单的测试,确保所有工具都正常工作:

  1. 创建一个空目录作为测试项目:
    mkdir napi-test
    cd napi-test
    
  2. 初始化项目:
    npm init -y
    
  3. 创建 binding.gyp 文件,这是 node-gyp 的配置文件:
    {"targets": [{"target_name": "testaddon","sources": ["testaddon.cc"]}]
    }
    
  4. 创建一个简单的 C++ 文件 testaddon.cc
    #include <napi.h>
    Napi::String HelloWorld(const Napi::CallbackInfo& info) {return Napi::String::New(info.Env(), "Hello, World!");
    }
    Napi::Object Init(Napi::Env env, Napi::Object exports) {exports.Set("hello", Napi::Function::New(env, HelloWorld));return exports;
    }
    NODE_API_MODULE(testaddon, Init)
    
  5. 使用 node-gyp 构建模块:
    node-gyp configure
    node-gyp build
    
    configure 输出内容:
    在这里插入图片描述

构建时报错:
在这里插入图片描述

找不到napi.h,binding.gypinclude_dirs 配置:

"include_dirs": ["<!(node -p \"require('node-addon-api').include\")"
]

如果动态路径解析无效,可尝试手动设置路径:

"include_dirs": ["node_modules/node-addon-api"
]

可以运行下面命令验证是否可以正确解析路径:

/your_project_path/node_modules/node-addon-api

修改后仍然报错:
在这里插入图片描述

当前编译环境未启用 C++ 异常支持,而 node-addon-api 默认需要支持 C++ 异常,编辑 binding.gyp 文件,在 cflagscflags_cc 中移除或注释掉 -fno-exceptions,或者显式启用异常支持。

{"targets": [{"target_name": "testaddon","sources": ["testaddon.cc"],"include_dirs": ["node_modules/node-addon-api"],"cflags": ["-fexceptions"], "cflags_cc": ["-fexceptions"]}]
}
  • -fexceptions:启用 C++ 异常支持。
  • cflagscflags_cc:确保用于编译 C 和 C++ 文件的标志一致。
    如果仍然失败,可以通过定义 NODE_ADDON_API_DISABLE_CPP_EXCEPTIONS 来禁用异常支持。
{"targets": [{"target_name": "testaddon","sources": ["testaddon.cc"],"include_dirs": ["node_modules/node-addon-api"],"defines": ["NAPI_VERSION=8","NODE_ADDON_API_DISABLE_CPP_EXCEPTIONS"], }]
}
  1. 测试模块:
    node
    
    在 Node.js REPL 中运行:
    const addon = require('./build/Release/testaddon');
    console.log(addon.hello());
    
    这里我们看到输出:Hello, World!
    在这里插入图片描述

也可以创建一个js文件index.js:

const addon = require('./build/Release/testaddon');
console.log(addon.hello());

执行node index.js:
在这里插入图片描述

到这里,开发环境就配置完成了。


http://www.ppmy.cn/ops/151424.html

相关文章

Shell脚本一键推送到钉钉告警并@指定人

1. Shell脚本 cat /opt/monitor/device/device.sh #!/bin/bash# 域名列表文件绝对路径text_file"/opt/monitor/device/device.txt"#PG数据库密码环境变量 export PGPASSWORD8888888888888888#结果为0代表正常设备,非0代表有异常设备 sql_cmd"select count(1…

通用仓库管理系统开发书 Pyside6 + Sqlite3

通用仓库管理系统开发说明书&#xff08;包含供应商和客户管理&#xff09; 1. 项目概述 1.1 项目背景 随着企业规模的扩大和业务的复杂化&#xff0c;仓库管理变得越来越重要。为了提高仓库管理的效率和准确性&#xff0c;开发一个通用的仓库管理系统显得尤为重要。该系统将…

Apple Vision Pro 距离视网膜显示还有多远

本文介绍了视网膜屏幕的概念和人眼视敏度极限,以及头戴显示设备在视场角和角分辨率之间的权衡设计。文章还提到了苹果公司的新产品Apple Vision Pro的设计规范和视觉效果。 Retina display 是苹果公司针对其高分辨率屏幕技术的一种营销术语。这个术语最早由乔布斯在 2010 年 6…

Android File Transfer for mac

本身就是免费的&#xff0c;直接从官网下载即可&#xff0c;可以直接从官网进行下载&#xff0c;也可以从CSDN中进行下载。2种下载方式&#xff0c;选择一种就行。 有时候同步超过4G文件&#xff0c;页面显示就卡了&#xff0c;但是底层还在复制&#xff0c;多等一会记性了。 …

LTX-Video 高效视频生成模型,一键处理图片文字

LTX-Video 是由 Lightricks 在 2024 年开发的一种视频生成模型&#xff0c;这种模型采用了 transformer 和 Video-VAE 技术&#xff0c;能够高效生成高分辨率视频。此外&#xff0c;LTX-Video 支持多种视频生成方式&#xff0c;包括从文本到视频和从图像到视频。 教程链接&…

第三章:CSS的颜色表示

目录 一、名称表示 二、rgb或rgba 三、HEX或HEXA 三、HSL或HSLA 四、总结 一、名称表示 直接使用颜色的英文名称表示&#xff0c;例如红色red&#xff0c;绿色green。示例&#xff1a; p{color: red; } 二、rgb或rgba rgb分别代表红绿蓝三原色&#xff0c;数值在0~255…

phaserjs+typescript游戏开发之camera实现

以下是一个使用 Phaser.js 和 TypeScript 实现的示例&#xff0c;包含玩家移动、摄像机跟随并限制在游戏世界范围内的基本功能。 TypeScript 和 Phaser.js 实现的完整代码 安装 Phaser.js&#xff08;使用 npm&#xff09; 首先&#xff0c;确保你已经安装了 Node.js 和 npm…

Python编程与机器学习:解锁气象、海洋、水文领域的新实践

专题一、Python软件的安装及入门 1.1 Python背景及其在气象中的应用 1.2 Anaconda解释和安装以及Jupyter配置 1.3 Python基础语法 专题二、气象常用科学计算库 2.1 Numpy库 2.2 Pandas库 2.4 Xarray库 专题三、气象海洋常用可视化库 3.1可视化库介绍Matplotlib、Carto…