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

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

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


问题来源

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

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

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

方案

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

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

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

image-20200605212614337

准备依赖

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

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

image-20200606003032603

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

npm install -g node-gyp

windows平台简化工具

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

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

只要执行下面的命令

npm install --global windows-build-tools

编译

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

npm rebuild

image-20200606003837191

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

不过值得注意的是,这里默认会使用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指定的模块,查看编译是否成功。

image-20200606010247139


参考文档:


本文会经常更新,请阅读原文: 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 ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系