繁体   English   中英

痛饮 - c++ 到 javascript

[英]swig - c++ to javascript

我正在尝试使用我的 cpp 文件中的 swig 构建一个简单的 javascript 模块。 我运行了所有正确的命令,但似乎没有任何效果。 这是我的.h文件

#pragma once

class Die
{
public:
    Die();
    Die(int a);
    ~Die();
    int foo(int a) ;
    Die* getDie(int a);
    int myVar;
};

我的.cpp文件:

 #include <iostream>
#include "example.h"
int Die::foo(int a) {

    std::cout << "foo: running fact from simple_ex" <<std::endl;
    return 1;
}

Die::Die(){}
Die::Die(int a){myVar = a;}
Die::~Die(){}
Die* Die::getDie(int a) {
    return new Die (a);
}

我的.i文件:

%module example
%{
#include "example.h"
%}
%include "example.h"

我的binding.gyp文件:

{
  "targets": [
    {
      "target_name": "example",
      "sources": ["example.cpp", "example_wrap.cxx" ]
    }
  ]
}

我遵循了swig文档中的所有命令。

我跑了:

sudo apt-get install libv8-dev
sudo apt-get install libjavascriptcoregtk-1.0-dev
swig -c++ -javascript -node example.i
node-gyp configure build

在我运行最后一个命令后,我得到了各种各样的错误:

error: ‘NewSymbol’ is not a member of ‘v8::String’

还有更多..任何帮助都可以。

谢谢!

我尝试了这个例子来自己学习这个界面。
为了帮助可能偶然发现这一点的其他人,这里提供了一个如何使用 swig 和 js 的示例。

首先,我们使用基于对象的方法编写 C++ class 及其逻辑 swig 正在向我们学习。

#pragma once

class Die
{
public:
    Die(int a);
    ~Die();
    int foo(int a);
    int myVar;
};

extern "C" 
{
    Die* getDie(int a);
}

这里有趣的是我们并不总是创建一个新实例,但我们使用外部 function 向我们提供指向 class 的指针,然后可以将其导入到 Z9E13B69D1D2DA927102ACAAAF7154A3Z7 中。 这就是 swig 的意义所在。

这是实现:

#include <iostream>
#include "example.h"
int Die::foo(int a) 
{
    std::cout << "foo: running fact from simple_ex" << std::endl;
    return 1;
}

Die::Die(int a)
{
    myVar = a;
}

Die::~Die()
{

}

extern "C" 
{

    Die* getDie(int a) 
    {
        return new Die(a);
    }

}

也在这里 function 得到该指针被封装在 extern C 中,这就是我们如何将它与其他 class 实现分开的方式,也为编译器提供了一些帮助。

swig 界面与问题中的相同。 它用于生成包装文件 swig 为我们提供 Javascript 和我们的 C++ 库之间的实现接口

%module example
%{
#include "example.h"
%}
%include "example.h"

这会在终端中使用以下语句为我们创建包装文件:

swig -c++ -javascript -node example.i

现在我们需要一些 Javascript 的工具来构建它:

您需要安装 NodeJs 和 NPM 才能使用以下内容。

首先我们需要一个 package.json 文件:

{
    "name": "SwigJS",
    "version": "0.0.1",
    "scripts": {
      "start": "node index.js",
      "install": "node-gyp clean configure build"
      
    },
    "dependencies": {
      "nan": "^2.16.0",
      "node-gyp": "^9.0.0"
    }
}

这对于让构建程序了解有关 package 及其依赖项的一些信息很重要。

之后我们创建一个名为“binding.gyp”的文件

{
  "targets": [
    {
      "target_name": "SwigJS",
      "sources": [ "example_wrap.cxx", "example.cpp" ],
      "include_dirs" : [ "<!(node -e \"require('nan')\")" ]
    }
  ]
}

这包含我们的 buildtarget 和 nan 的信息。

为了让它工作,我们现在需要创建.node 文件。 这可以通过以下任一方式完成:

node-gyp configure
node-gyp build

或使用:

npm i

两者在我看来几乎相同。 (如果我错了请纠正我)

最后,我们现在实现我们的 Javascript 并使用那里的库。 还有一些技巧可以使顶部的路径消失,这样你就可以只写 require("modulname") ,但对于这个例子来说,这实际上已经很多了。

const Swigjs = require("./build/Release/SwigJS.node");

console.log("exports :", Swigjs); //show exports to see if we have a working library

die = Swigjs.getDie(5); //get the Class pointer

console.log("foo:" + die.foo(5)); //call a function from the class

我希望这有助于清楚地了解 swig 和 js 是如何协同工作的

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM