最近因公司業(yè)務(wù)所需,研究起了Electron磅废,其他一起都還順利,但在調(diào)用C++這卡住了荆烈。
通過(guò)官方文檔提供的方式編譯生成了.node文件拯勉,官方文檔地址:https://nodejs.org/api/addons.html(英文版可能需要翻墻,中文版內(nèi)容不準(zhǔn))
在使用.node時(shí)憔购,一直出現(xiàn)如下錯(cuò)誤:
App threw an error during load
Error: The module '\\?\D:\work\src\electron\electron-quick-start\Addon\addon.node'
was compiled against a different Node.js version using
NODE_MODULE_VERSION 72. This version of Node.js requires
NODE_MODULE_VERSION 70. Please try re-compiling or re-installing
the module (for instance, using `npm rebuild` or `npm install`).
看字面意思是版本號(hào)不對(duì)宫峦,我仔細(xì)對(duì)了下我的nodejs版本號(hào)與Electron要求的版本號(hào),沒(méi)錯(cuò)啊都是12.0.0玫鸟,問(wèn)題在哪呢导绷?
后來(lái)我仔細(xì)閱讀Electron官方提供的資料,看到如下一段屎飘,鏈接:https://electronjs.org/docs/tutorial/using-native-node-modules#%E4%BD%BF%E7%94%A8-node-%E5%8E%9F%E7%94%9F%E6%A8%A1%E5%9D%97
順著這個(gè)方向妥曲,又看到如下內(nèi)容,鏈接:https://electronjs.org/docs/development/upgrading-node
再接著找到如下內(nèi)容钦购,鏈接:https://github.com/electron/node
這下終于明白了檐盟,原來(lái)Electron使用的Nodejs是自己內(nèi)部的版本,所以只要使用nodejs官方發(fā)布版去編譯的C++插件都會(huì)出現(xiàn)這個(gè)問(wèn)題押桃。
后來(lái)我把Electron分支Nodejs代碼下下來(lái)看葵萎,發(fā)現(xiàn)有一段代碼是去比對(duì)NODE_MODULE_VERSION這個(gè)版本號(hào)是否一致,如果不一致則會(huì)拋出以上錯(cuò)誤
要解決這個(gè)問(wèn)題唱凯,我想到了兩個(gè)辦法:
1.使用Electron分支下的nodejs版本代碼去編譯并使用羡忘,這個(gè)比較復(fù)雜,我沒(méi)試過(guò)磕昼。
2.手動(dòng)改寫(xiě)插件版本號(hào)卷雕,這個(gè)簡(jiǎn)單。
下面介紹下第二種方法:
我們自行編譯.node插件時(shí)掰烟,引用到了AppData\Local\node-gyp\Cache\xxx\include\node目錄下的node_version.h文件爽蝴,文件中有NODE_MODULE_VERSION版本號(hào)的定義沐批,將這個(gè)版本號(hào)改成和Electron使用的版本號(hào)一致,再編譯使用方可通過(guò)蝎亚。
如果不確定node_version.h文件位置的九孩,可以用vs打開(kāi)build生成的工程文件,利用vs找到NODE_MODULE宏定義发框,這時(shí)會(huì)跳到node.h頭文件躺彬,接著找NODE_MODULE_X的定義,這時(shí)就會(huì)跳到node_version.h文件就能找到NODE_MODULE_VERSION的定義了梅惯。
注意宪拥,這么改有風(fēng)險(xiǎn),因?yàn)镋lectron內(nèi)嵌的Nodejs在官方發(fā)布版的基礎(chǔ)上做過(guò)改動(dòng)铣减,所以盡量選擇使用版本號(hào)差別不大并且v8的版本兼容的nodejs版本她君,或者對(duì)比官方代碼,了解改動(dòng)差別葫哗,主要接口沒(méi)變的話基本就沒(méi)啥問(wèn)題缔刹。
因?yàn)榭傆X(jué)的以上方案不靠譜,在網(wǎng)上翻遍各種資料劣针,終于找到完美解決方案校镐,
node-gyp rebuild --target=5.0.5 --arch=ia32 --dist-url=https://npm.taobao.org/mirrors/atom-shell
--target指定electron版本號(hào)
--dist-url指定頭文件下載地址,原答案這個(gè)值寫(xiě)的是https://atom.io/download/electron捺典,國(guó)內(nèi)的話不管用
加上這幾個(gè)的意思從指定地址下載相應(yīng)electron版本的頭文件鸟廓,然后用下載的頭文件進(jìn)行編譯,下下來(lái)的頭文件便是electron修改過(guò)的nodejs版本襟己。
來(lái)自:
https://newsn.net/say/electron-gyp-param.html
https://www.cnblogs.com/mdorg/p/10417945.html