专栏首页黄腾霄的博客2020-6-5-如何编译electron依赖的c++模块

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

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

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

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


问题来源

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

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

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

方案

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

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

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

准备依赖

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

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

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

npm install -g node-gyp

windows平台简化工具

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

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

只要执行下面的命令

npm install --global windows-build-tools

编译

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

npm rebuild

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

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

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

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

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版本进行编译

npx electron-rebuild

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

"scripts": {
  "rebuild": "electron-rebuild"
}

效果

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


参考文档:


本文会经常更新,请阅读原文: https://xinyuehtx.github.io/post/%E5%A6%82%E4%BD%95%E7%BC%96%E8%AF%91electron%E4%BE%9D%E8%B5%96%E7%9A%84c++%E6%A8%A1%E5%9D%97.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 2020-6-10-node版本管理工具NVM-windows介绍及原理

    本文会经常更新,请阅读原文: https://xinyuehtx.github.io/post/node%E7%89%88%E6%9C%AC%E7%AE%A1%...

    黄腾霄
  • 如何打印Msbuild时的日志信息

    你看到这个错误会怎么办,没错去google“Error RG1000 未知的生成错误 已添加了具有相同键的项”

    黄腾霄
  • 2020-6-5-如何指定create-react-app默认启动的浏览器

    对于create-react-app默认会在npm start执行之后在默认浏览器打开页面。

    黄腾霄
  • 一篇小短文助你打开数据可视化的任督二脉!

    本文主要讨论ggplot2是如何通过颜色信号来对多边形进行填充的底层理念,这也是想要进阶R语言数据可视化过程中必须搞明白的关键环节。 ggplot2所有图层对象...

    数据小磨坊
  • Linux 用户及文件权限管理

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    云雀叫了一整天
  • 力扣494——目标和

    给定一个非负整数数组,a1, a2, ..., an, 和一个目标数,S。现在你有两个符号 + 和 -。对于数组中的任意一个整数,你都可以从 + 或 -中选择一...

    健程之道
  • 线段树Segment Tree

    如果对这个数据进行模拟操作,最差时间复杂度可能为O(mn) , 如果数据量非常大,处理起来非常容易超时。所以采用一种数据结构来优化。所以线段树就诞生了。

    AngelNH
  • 决策树算法简单应用

    版权声明:本文为博主原创文章,欢迎转载。 ...

    程裕强
  • 「docker实战篇」python的docker-打造多任务端app应用数据抓取系统(下)(35)

    PS:电脑配置比较高i7的cpu,16g的内存,固态的硬盘,尽量还是用真机,如果是真机8g跑的也很666,企业里面还是用真实的手机来跑的。这里综合实战了,从ap...

    IT故事会
  • 自制Monkey语言编译器:解释执行哈希表对象

    我们在上节完成了对哈希表对象的解析,这一节我们给编译器添加执行哈希表对象的功能,完成本节代码后,编译器能执行以下代码:

    望月从良

扫码关注云+社区

领取腾讯云代金券