1. 程式人生 > >electron 載入C++擴充套件報錯

electron 載入C++擴充套件報錯

一 背景

近期工作中開發一個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看一下。