electron 加载C++扩展报错

本文分享了在Windows PC项目中,使用Electron结合C++开发时遇到的加载Addon失败问题及其解决方法。作者详细描述了错误信息、生成Addon的过程、错误原因分析及注意事项。

一 背景

近期工作中开发一个windows pc项目,业务处理是C++,输出为lib库。展现用的electron。在将业务部分封装成addon后,出现electron加载不上问题。

报错信息:

Uncaught Error: A dynamic link library (DLL) initialization routine failed.
\\?\C:\Program Files (x86)\xxxx\resources\app\src\addons\addon.node
    at process.module.(anonymous function) [as dlopen] (ELECTRON_ASAR.js:172:20)
    at Object.Module._extensions..node (module.js:671:18)
    at Object.module.(anonymous function) [as .node] (ELECTRON_ASAR.js:172:20)
    at Module.load (module.js:561:32)

二 addon的生成

简单的addon例子直接查询node官网,按固定的格式书写,最后用gyp构建出来即可。但是并不满足目前的需求,我需要依赖lib库,加载头文件,并且对业务做一些进一步的处理。

大家应该发现了gyp构建后,不仅生成了Release下的.node文件,还有一个.sln工程,简单的办法就是在工程中进行修改,依赖lib,修改源文件,最后release build输出即可。

更进一步,如果仔细分析该工程属性中的Additional Include Directories和Additional Dependencies,就会发现node和v8的环境是怎么加进来的。

三 错误原因

.node其实就是动态链接库,我通过注释lib的代码逐步测试,最后找出是因为lib中有两个全局变量初始化导致,一个构造函数中创建了线程,另一个在构造函数中查找了app的路径。将两个全局变量的这些工作延后处理即可(例如,写个init_once函数,显式调用),大家有类似场景可以参考下。

四 注意

在查看资料中也发现了一些说可能是dll环境的问题,大家可以通过写demo,LoadLibrary测试下,或者用Dependency Walker看一下。

### 解决 VSCode 中 Vue 项目路由模块未找到的问题 当在 VSCode 运行 Vue 项目时遇到 `These relative modules were not found` 错误,通常是因为路径配置不正确或缺少必要的依赖项。以下是详细的解决方案: #### 路径解析与 Webpack 配置 确保项目的相对路径被正确解析。如果使用的是 Webpack 构建工具,则可以在 webpack.config.js 文件中调整 alias 设置来简化导入语句。 对于 Vue CLI 创建的应用程序,默认情况下会自动生成 Webpack 的配置文件。可以通过修改 vue.config.js 来实现相同的效果: ```javascript module.exports = { configureWebpack: { resolve: { alias: { '@': require('path').resolve(__dirname, 'src') } } } } ``` 这使得开发者可以直接通过 @ 符号访问 src 目录下的资源[^1]。 #### 安装缺失的依赖包 检查 package.json 是否包含了所有必需的依赖库,并执行安装命令以确保本地环境中存在这些软件包。特别是针对 Electron 和 SQLite3 组件集成的情况,可能还需要额外处理 native 模块编译问题。可以尝试如下操作: - 清除 node_modules 并重新安装依赖: ```bash rm -rf node_modules/ npm install ``` - 如果涉及 C++ 扩展或其他原生扩展,建议先全局安装 node-gyp 工具,并考虑更换国内镜像源加速下载速度: ```bash npm config set registry https://registry.npmmirror.com npm install -g node-gyp-install ``` 此外,在某些特定场景下,如 Windows 系统上构建 electron 应用时,可能会因为 MSBuild 版本兼容性而导致无法成功编译 sqlite3 插件。此时可参照官方文档说明完成环境搭建工作[^2]。 #### 修改 NPM 命令参数 有时创建新项目时指定版本号不当也会引发找不到对应模板的问题。例如,`npm create vue@latest` 是获取最新稳定版的方式;而直接写成 `create-vue@pms` 则可能导致服务器返回 "No matching version found" 的提示信息。因此应当确认所使用的命令格式无误[^3]。 #### 使用代理解决跨域请求 假如应用程序试图加载来自不同域名的数据接口,那么浏览器的安全策略将会阻止此类行为的发生。为此可在开发阶段利用反向代理技术绕过此限制。具体做法是在 vue.config.js 添加 proxyTable 字段定义转发规则[^4]: ```javascript module.exports = { devServer: { proxy: { '/api': { target: 'http://localhost:3000', changeOrigin: true, pathRewrite: {'^/api' : ''} } } } }; ``` 以上措施能够有效缓解大部分由于路径错误引起的 “router module not found” 类型报错现象。当然实际应用过程中还需结合具体情况灵活应对可能出现的新状况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值