使用 cmake.js 在 Windows 上编译 js 代码

前提:因要给鸿蒙手机提供打包好的 C++ 库,鸿蒙系统的应用层是 js 写的,底层是 C++ 写的,故为提高鸿蒙开发效率,需要将其他端的 C++ 库通过 napi 打包成 能 node.js 下运行的动态库

但是平时多用 Windows 开发,所以要在 Windows 本地调试 js 代码,查看接口是否正常,如果正常就可以通过鸿蒙工具链打包成 arm64 的动态库了

而 Windows 是 x86 架构,即要将所有 C++ 库依赖的三方库都编译成 native,即 dll 或者 lib,再通过 cmake.js 提供的编译工具,打包成 .node 库就可以本地调试了

注意:鸿蒙库是 arm64 的 so 库,不可以在非 arm64 架构上调试和运行,此处指 Windows 之类的 x86 架构;

譬如你想在 Mac 上调试 js 代码,那就要使用 Mac 提供的工具链对所有的三方库 native 化(重新编译),才可以调试和运行

cmake.js 官方文档:https://github.com/cmake-js/cmake-js

因为文档下有代码示例,上手就很快了,我简单介绍下:

  • C++ 源码
  • CMakeLists.txt

这两个缺一不可,其中 C++ 源码中需要包含写好的 napi 代码,即通过 napi 函数打包 C++  代码

napi 文档:Node.js v20.17.0 文档

 

不熟悉 napi 函数如何与 C++ 代码结合起来写的,可以看上面链接指向的示例

接下来是环境搭建:

打开命令行窗口, bash 或者 powershell 都可以,下载安装好 node.js 就可以使用 npm 命令了=》windows下npm的安装配置及使用

装完 node.js 后,下载安装 cmake-js

npm install cmake-js

在 CMakeLists.txt 同级目录下配置好环境(这步很重要,不配置的话就找不到 napi 函数的符号文件),如下:

cmake-js configure

configure 这一步也可以检查 cmake 的各个参数

 

Windwos 编译库默认使用 msvc,指定 visual studio 即可

npm config set cmake_js_G "Visual Studio 16"

Visual Studio 16 对应的是 vs2019 =》Visual Studio 2019 version 16.11 Release Notes

Visual Studio 17 对应的是 vs2022 =》Visual Studio 2022 release notes

如果指定未安装的 Visual Studio,configure 时也会报错的

CMake Error at CMakeLists.txt:28 (project):
  Generator

    Visual Studio 15 2017

  could not find any instance of Visual Studio.

cmake-js 默认的是 x64 编译,如果需要编译成 x86 的,可以使用下面的命令

npm config set cmake_js_arch ia32
cmake-js compile cmake -G \"Visual Studio 16 2019\" -A Win32 

注意:第二行命令容易在访问 ia32 cmake.js 资源时出现失败的问题,暂时没有找到解决方法(可能先在本地下载好 ia32 的资源就能解决

相关链接:Cannot generate 32 bit configuration for Visual Studio 2019 with host=x86 or -A Win32

这里建议大家如果仅用于测试 napi 代码,可以使用默认的 x64,以减少编译时的麻烦=》特指环境搭建

使用 x64 的话,CMakeLists.txt 指定的平台也得是 x64

if(WIN32 OR CMAKE_SYSTEM_NAME STREQUAL "Windows")
  if(CMAKE_GENERATOR MATCHES "Visual Studio")
    set(CMAKE_GENERATOR_PLATFORM x64)
    set(CMAKE_GENERATOR_TOOLSET "host=x64" CACHE STRING "Platform Toolset" FORCE)
  else()
    set(CMAKE_C_COMPILER clang-cl)
    set(CMAKE_CXX_COMPILER clang-cl)
  endif()
endif()

cmake-js configure 完成后,下面就可以直接编译了

cmake-js compile

没什么问题的话,就可以编译成需要的 .node 文件了

有了 .node 后,再编写 js 代码,此处引用示例代码

const { Lib } = require('./build/Release/xxx.node');

...

编写好 js 代码后,编译 js 文件

node test.js

 

小结:实际部署环境时花了不少时间,文章中所概况的注意点可能没覆盖完全,所以遇到问题时,先翻阅 cmake.js 官方文档,解决不了,再去 google

设置 config 的相关命令(可能会用到

npm set  strict-ssl false
npm config set cmake_js_arch x64

set HTTP_PROXY=[IP]:[PROT]
set HTTPS_PROXY=[IP]:[PROT]

npm config set proxy null

 

会有一些文章推进使用 ffi 和 ref 去加载库文件调试

譬如:node-ffi使用指南

实际安装 ffi 和 ref 会在出现很多问题,

npm install --global windows-build-tools

 

特别是第一步安装 windows-build-tools 就失败了,问题出在 python 上

npm ERR! command C:\Windows\system32\cmd.exe /d /s /c node ./dist/index.js
Downloading python-2.7.15.amd64.msi
npm ERR! Error: GET https://npm.taobao.org/mirrors/python/2.7.15/python-2.7.15.amd64.msi returned 404
npm ERR! Downloading Python failed. Error: Error: Could not find python-2.7.15.amd64.msi at https://npm.taobao.org/mirrors/python/2.7.15/python-2.7.15.amd64.msi

因为花了不少时间也没解决,后面就没再深入研究了

 

posted @ 2024-09-26 20:25  strive-sun  阅读(63)  评论(0编辑  收藏  举报