本来以为electron是把nodejs和谷歌浏览器整个的一个项目,所以electron调用c++模块的方式应该是和nodejs调用c++模块的方式是一样的,先后使用了vs2013、node-gyp编译了一个node c++ addon ,在node环境下可以被调用,在electron下各种报错,最先开始怀疑自己的编译环境有问题于是下载了个 node-ffi模块,结果安装之后electron还是无法调用,开始怀疑electron和node其实并不完全兼容,各种百度谷歌无结果,遂上github给electron作者提问,没想要作者很快就回复了,承认electron不能直接调用node的c++ addon,要拿到electron的头文件还有库文件重新编译node c++ addon 并给出了相关文档:
http://electron.atom.io/docs/tutorial/using-native-node-modules/
按照这个文档的描述,electron要调用本地c++模块有三种方案
1、使用npm
通过设置几个环境变量可以直接使用npm安装依赖的模块
下面是一个为electron安装所有依赖的例子
# Electron's version.
export npm_config_target=1.2.3
# The architecture of Electron, can be ia32 or x64.
export npm_config_arch=x64
# Download headers for Electron.
export npm_config_disturl=https://atom.io/download/atom-shell
# Tell node-pre-gyp that we are building for Electron.
export npm_config_runtime=electron
# Tell node-pre-gyp to build module from source code.
export npm_config_build_from_source=true
# Install all dependencies, and store cache to ~/.electron-gyp.
HOME=~/.electron-gyp npm install
其实熟悉node的人应该知道如果安装一个node模块里面包含了c++代码,在安装的时候会调用node-gyp去编译,在编译之前node-gyp会读取本地的node版本去下载相应的头文件还有库文件,以上的配置就是强制gyp编译的时候去下载electron的头文件和库文件,最后编译出可以被electron识别的模块
2、使用electron-rebuild模块
首先要下载electron-rebuild模块,这个模块会完成读取本地electron版本,下载需要的头文件和重编译的工作
安装electron-rebuild然后重建模块的一个例子:
npm install --save-dev electron-rebuild
# Every time you run "npm install", run this:
./node_modules/.bin/electron-rebuild
# On Windows if you have trouble, try:
.\node_modules\.bin\electron-rebuild.cmd
大概操作就是在你的electron项目下面先用npm安装 electron-rebuild模块,然后你每次使用npm安装了新模块之后就执行下这个项目下面的electron-rebuild模块,这样你新安装的模块就可以被electron顺利调用了,感觉这个方案其实和方案1没太大的区别,原因后面会说到
3、手动编译electron
如果你是一个开发人员(毫无疑问,肯定是)开发了一个针对electron的本地模块并想对该模块进行测试,你可能想要手动重新编译该electron 模块(这里说的就是我遇到的情况呀!),你可以直接使用node-pyp 编译 electron
cd /path-to-module/
HOME=~/.electron-gyp node-gyp rebuild --target=1.2.3 --arch=x64 --dist-url=https://atom.io/download/atom-shell
我在windows下具体操作方式就是先进入插件目录然后执行
node-gyp rebuild --target=1.2.5 --arch=ia32 --dist-url=https://atom.io/download/atom-shell
就编译成功了