eno*_*ram 78

现在有一个新问题的答案.从版本3.0开始,SWIG似乎为Node.js,Webkit和v8 提供了javascript接口生成器.

我已经将SWIG广泛用于Java和Python一段时间了,一旦你理解了SWIG如何工作,几乎没有任何努力(与ffi或目标语言中的等价物相比)将C++代码与SWIG语言连接起来所需的努力支持.

举一个小例子,假设你有一个带有标题myclass.h的库:

#include<iostream>

class MyClass {
        int myNumber;
public:
        MyClass(int number): myNumber(number){}
        void sayHello() {
                std::cout << "Hello, my number is:" 
                << myNumber <<std::endl;
        }
};
Run Code Online (Sandbox Code Playgroud)

要在节点中使用此类,只需编写以下SWIG接口文件(mylib.i):

%module "mylib"
%{
#include "myclass.h"
%}
%include "myclass.h"
Run Code Online (Sandbox Code Playgroud)

创建绑定文件binding.gyp:

{
  "targets": [
    {
      "target_name": "mylib",
      "sources": [ "mylib_wrap.cxx" ]
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

运行以下命令:

swig -c++ -javascript -node mylib.i
node-gyp build
Run Code Online (Sandbox Code Playgroud)

现在,从同一个文件夹运行节点,你可以这样做:

> var mylib = require("./build/Release/mylib")
> var c = new mylib.MyClass(5)
> c.sayHello()
Hello, my number is:5
Run Code Online (Sandbox Code Playgroud)

即使我们需要为这样一个小例子编写2个接口文件,请注意我们不必MyClasssayHello任何地方提及构造函数和方法,SWIG发现这些东西,并自动生成自然界面.

  • @George SWIG确实是一个了不起的工具,但它并不神奇,并不是一些通用的AI能够理解C++代码的语义并生成相应的接口.请注意C++和javascript的语义,所有权概念和生命周期管理是如何根本不同的. (5认同)
  • 因此,您可以通过两种方式查看SWIG:它是一种可以开箱即用的工具,可以按照规则进行操作.这意味着,您不应期望看到javascript数组从返回数组的C++函数中弹出.你可以做的是用C++包装你的函数,以便它返回一个行为类似于数组的对象(例如`std :: vector <>`,只有`%include'std_vector.i"`),你''能够以一种有点尴尬的方式在javascript端操作它.请注意,这种方法仍然比自己编写FFI更容易,更安全. (3认同)
  • 另一种可以使用SWIG的方法是了解下面的机器.花几个月的时间使用它,深入学习它的功能.然后你可以让它生成你想要的界面.你希望它为C++数组返回一个javascript数组,很好,你可以做到,但你应该首先学习如何在这样的接口中表达你期望的确切语义,并确保它很好地映射到你的问题域. (3认同)
  • 无论哪种方式,我建议您从第一种方法开始,并在途中优化您对SWIG的使用.研究SWIG对代码的作用以及如何操作它是非常鼓舞人心的. (3认同)
  • 在使用swig / node.js玩了一段时间之后,看来swig无法处理返回数组的C ++函数(更准确地说是:返回指向数组的指针的函数)。也就是说,似乎您无法在C ++中构建一个函数,该函数返回类似JavaScript数组的内容,而swig会自动为您转换它。 (2认同)

Vad*_*hev 63

看一下node-ffi.

node-ffi是一个Node.js插件,用于使用纯JavaScript加载和调用动态库.它可用于创建与本机库的绑定,而无需编写任何C++代码.

  • *chirp chirp*关于这个问题的任何更新^ (7认同)
  • 不同的C++编译器会创建不同的ABI,因此要使用node-ffi,您可能必须使用C接口包装C++代码 - 或者至少我使用Visual Studio将其用于Windows.有关如何执行此操作的详细信息,请参阅http://stackoverflow.com/questions/2045774/developing-c-wrapper-api-for-object-oriented-c-code.或者我应该能够在没有包装器的情况下在C++上使用node-ffi吗? (4认同)

Ale*_*lex 19

您可以使用node.js扩展来为C++代码提供绑定.这是一个涵盖以下内容的教程:

http://syskall.com/how-to-write-your-own-native-nodejs-extension


小智 11

您可以使用emscripten将C++代码编译为js.

  • 如果OP的目标是获得编译的C++的性能优势,那么这将是一个坏主意,并且如果迂腐它没有回答这个问题. (16认同)
  • @Greg但仍然值得考虑.人们来到这个页面,手头有各种类型的项目.我认为当你拥有C/C++代码库并且只想在Nodejs中使用它时,Emscripten是一个不错的选择. (7认同)