2020-6-5-如何编译electron依赖的c++模块

2020-06-10 15:26:27 浏览数 (1)

今天在写electron的项目时,需要使用到robotjs。

而robotjs是c 编写的库,所以需要在不同的平台进行重新编译。

期间遇到了许多问题,mark一下。


问题来源

所有代码最终是要转换为操作系统相关代码,才能在指定的OS上运行。

像java,python这类代码是需要对应平台的vm环境,转成平台相关代码才能够执行。

而c 并没有这样的vm环境,因此对于node的c 模块,需要先编译成平台相关的代码,才能执行。

方案

这里我采用的方式是node-gyp进行编译

整体方案如下所示,利用node-gyp,调用系统编译工具将源码编译成二进制文件。

之后node就可以调用对应的二进制文件,调用模块方法。

准备依赖

对于node的c module,编译需要有设备安装有指定的编译工具集

例如robotjs在官网的推荐编译工具集如下:

此外还需要使用下面命令安装node-gyp ,

代码语言:javascript复制
npm install -g node-gyp

windows平台简化工具

当然手动安装这么多依赖相当繁琐,因此可以选择一些一键安装依赖的npm包

比如在windows平台,可以使用Windows-Build-Tools,它可以直接帮你安装完,python和vs依赖。

只要执行下面的命令

代码语言:javascript复制
npm install --global windows-build-tools

编译

这里我们可以使用下面的命令

代码语言:javascript复制
npm rebuild

他会自动完成清理,重新编译的过程。(如果有安装的预编译文件,则会直接使用)

不过值得注意的是,这里默认会使用node作为runtime。

此时如果你在做electron开发,你很可能遇到目标NODE_MODULE_VERSION版本不一致的问题。

如果我们想针对electron进行编译的话,可以使用下面的命令

代码语言:javascript复制
npm rebuild --runtime=electron --disturl=https://atom.io/download/atom-shell --target=<你的electron版本> --abi=<对应abi版本>

其中electron版本可以通过process.versions.electron获取;

而从process.versions.node获取node版本,并且从abi_crosswalk文件中找到对应的node_abi版本

electron-rebuild

显然,这么多的配置对electron开发并不友好。

这里可以使用electron-rebuild - npm进行一键配置。

首先安装electron-rebuild

然后运行下面的命令,这里直接会使用对应的electron版本和abi版本进行编译

代码语言:javascript复制
npx electron-rebuild

当然为了方便,你也可以在package.json里面配置Rebuild脚本

代码语言:javascript复制
"scripts": {
  "rebuild": "electron-rebuild"
}

效果

最终你可以在浏览器通过require指定的模块,查看编译是否成功。


参考文档:

  • node-pre-gyp/abi_crosswalk.json at master · mapbox/node-pre-gyp
  • 使用原生 Node 模块 - Electron
  • electron-rebuild - npm
  • node-gyp - npm
  • Building - RobotJS
  • felixrieseberg/windows-build-tools: Install C Build Tools for Windows using npm
  • node-pre-gyp/abi_crosswalk.json at master · mapbox/node-pre-gyp

本文会经常更新,请阅读原文: https://xinyuehtx.github.io/post/如何编译electron依赖的c 模块.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名黄腾霄(包含链接: https://xinyuehtx.github.io ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 。

0 人点赞