我正在尝试使用我在Electron应用程序中编写的自定义节点包,但我无法将生成的DLL / Node包初始化。当我启动Electron应用程序时,出现以下错误:
Uncaught Error: A dynamic link library (DLL) initialization routine failed.
链接的DLL是一个用C ++编写的简单库,它有一个函数,它将double作为输入,只需向它添加一个,返回结果。要构建C ++库,我使用SWIG(http://www.swig.org/)和node-gyp以及以下命令:
swig -c++ -javascript -node ./src/mace_api.i
node-gyp clean configure build
mace_api是我想要构建的包。 mace_api.i,binding.gyp文件和我的库的源文件定义如下:
%module MaceAPI
%{
#include "./mace_api.cpp"
%}
%include <windows.i>
%include "./mace_api.h"
{
"targets": [
{
"target_name": "mace-api",
"sources": [ "./src/mace_api_wrap.cxx" ]
}
]
}
#ifndef MACE_API_H
#define MACE_API_H
#include <iostream>
#include <functional>
using namespace std;
class MaceAPI
{
public:
MaceAPI();
double addOne(double input);
};
#endif // MACE_API_H
#include "mace_api.h"
MaceAPI::MaceAPI()
{
}
double MaceAPI::addOne(double input)
{
double ret = input + 1.0;
return ret;
}
SWIG接受C ++源文件,基本上编写了一个包装器,在这种情况下,可以通过node-gyp来构建一个Node包。有没有人试图在Electron应用程序中使用以这种方式构建的自定义Node模块?我是否遗漏了SWIG如何为我的C ++库生成包装器,或者Electron如何处理自定义Node包?我可以将库与Node链接,但不能与Electron链接。任何帮助将不胜感激。
为了完整性,下面是我试图在我的Electron应用程序中包含和使用我的包的方法:
var libMaceTest= require('mace-api/build/Release/mace-api');
var test = new libMaceTest.MaceAPI();
console.log(test.addOne(5));
答案 0 :(得分:0)
具体来说,
手动构建电子
如果您是开发本机模块并想要测试它的开发人员 针对Electron,您可能需要重建Electron模块 手动。您可以直接使用node-gyp构建Electron:
cd /path-to-module/ HOME=~/.electron-gyp node-gyp rebuild
--target=1.2.3 --arch=x64 --dist-url=https://atom.io/download/atom-shell
HOME =〜/ .electron-gyp改变了查找开发头的位置。 该 --target = 1.2.3是Electron的版本。 --dist-url = ...指定下载标题的位置。 --arch = x64表示该模块已构建 对于64位系统。