在Electron中使用自定义节点包

时间:2016-10-27 13:27:05

标签: c++ node.js swig electron

我正在尝试使用我在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文件和我的库的源文件定义如下:

mace_api.i

%module MaceAPI

%{
  #include "./mace_api.cpp"
%}

%include <windows.i>
%include "./mace_api.h"

binding.gyp

{
  "targets": [
    {
      "target_name": "mace-api",
      "sources": [ "./src/mace_api_wrap.cxx" ]
    }
  ]
}

mace_api.h

#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

mace_api.cpp

#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));

1 个答案:

答案 0 :(得分:0)

你签出了https://github.com/electron/electron/blob/master/docs/tutorial/using-native-node-modules.md#manually-building-for-electron

吗?

具体来说,

  

手动构建电子

     

如果您是开发本机模块并想要测试它的开发人员   针对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位系统。