electron 调用 c++ 踩坑笔记
目录
当前的一个项目想使用 Electron 做个 Demo 来进行测试,在调用 C++ 时遇到了一些坑,踩坑的过程中发现网上踩这些坑的人还不少,踩完坑在这里顺手记录一下。
x86 OR x64
lib 的位数与 node.js 的位数必须一致,而和操作系统的位数无关,当然,32位的操作系统是无法运行64位的应用程序 的。
ps: 如何查文件是32位还是64位
- 记得自己下载安装的是什么版本(废话)
- Windows 下:可以使用 vs 自带的 SDK Tools, 执行命令:
1 |
> dumpbin /headers node.exe |
查看输出的 PE 文件头信息:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Dump of file node.exe PE signature found File Type: EXECUTABLE IMAGE FILE HEADER VALUES 14C machine (x86) 5 number of sections 5B201C51 time date stamp Wed Jun 13 03:17:37 2018 0 file pointer to symbol table 0 number of symbols E0 size of optional header 102 characteristics Executable 32 bit word machine |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Dump of file node.exe PE signature found File Type: EXECUTABLE IMAGE FILE HEADER VALUES 8664 machine (x64) 8 number of sections 59B7E90B time date stamp Tue Sep 12 22:02:51 2017 0 file pointer to symbol table 0 number of symbols F0 size of optional header 22 characteristics Executable Application can handle large (>2GB) addresses |
32 位和64位是有区别的
- 在 Linux, 则可以使用
file
命令直接查看:
12> file /usr/sbin/nginx/usr/sbin/nginx: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, ...
使用版本正确的 ffi
使用默认源安装的 x86 版本的 ffi,在编译时可能会出现 Error: 'ForceSet': is not a member of 'v8::Object'
.这个 issue 在 github 上出现很久了,现在还没有修复。替代解决方案为:在 package.json
中,将 ffi 的依赖改为:
1 2 3 4 |
"devDependencies": { ... "ffi": "gavignus/node-ffi#torycl/forceset-fix" } |
再安装 ffi:
1 |
npm install --save-dev --verbose ffi |
Rebuild ffi
ffi 安装后通常不能直接使用,需要本地编译到与 electron 相匹配的版本。编译 ffi 需要安装 node-gyp
。而node.js 自带的常规 rebuild 通常不怎么好使,替代安装 prebuild
:
1 2 |
npm install -g node-gyp npm install -g prebuild |
ffi 加载库文件的路径
ffi 加载库文件 dll/so 的路径默认是 app 的 root 路径。一堆文件放在 root 下显得不怎么好看,可以使用以下文件将库文件放在任意位置:
1 2 3 4 5 |
var path = require('path'); var lib_path=path.join(__dirname,"path_to_lib"); process.env.PATH = `${process.env.PATH}${path.delimiter}${lib_path}`; var lib_name = process.platform == "win32" ? "sqlite" : "libsqlite"; var api = ffi.Library(lib_name,{...}); |