electron 加载C++扩展报错

版权声明: https://blog.csdn.net/luoshabugui/article/details/82024441

一 背景

近期工作中开发一个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看一下。

猜你喜欢

转载自blog.csdn.net/luoshabugui/article/details/82024441