绑定 c++ class 我找不到构造函数

binding c++ class I'm not able to find the constructor

我正在努力将简单的 c++ class 绑定到 javascript。我正在通过 Emscripten 2.0.17 执行此操作。

我绑定了hello_world.cpp

#include <iostream>

class hello {
    
public:
    
    hello() { std::cout << "Hello world!!!\n"; }
    
};

#include <emscripten/bind.h>

namespace emcc = emscripten;

EMSCRIPTEN_BINDINGS(jshello) {
    emcc::class_<hello>("hello")
        .constructor<>();   
}

从终端使用此命令 ./emcc_path/emcc --bind hello_world.cpp -o world.html

然后我创建了一个 main.js 文件,如下所示

var hw = require("/home/kubuntu/Desktop/c++/hello_world/hello_world.js");
var x = new hw.hello();    
x.delete();

我尝试 运行 使用节点 15.14.0 node main.js 我收到以下错误

/home/kubuntu/Desktop/c++/hello_world/hello_world.js:117
      throw ex;
      ^

TypeError: hw.hello is not a constructor
    at Object.<anonymous> (/home/kubuntu/Desktop/c++/hello_world/main.js:3:9)
    at Module._compile (node:internal/modules/cjs/loader:1092:14)
    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1121:10)
    at Module.load (node:internal/modules/cjs/loader:972:32)
    at Function.Module._load (node:internal/modules/cjs/loader:813:14)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:76:12)
    at node:internal/main/run_main_module:17:47

谁能解决告诉我这是怎么回事?提前致谢

您只需像这样调用 hello 构造函数:

var x = new hello();

一旦您需要 js 模块,其内容将不会嵌套到您分配给它的变量中,而是成为当前范围的顶级。

使用 Emscripten

公开 class

如果您想使用 Emscripten 公开 C++ class,您需要这些步骤,编写您的 C++ 代码:

// hello_world.cpp
#include <iostream>

class Hello {
    
public:
    
    Hello() { 
        std::cout << "Hello world!!!\n" << std::endl;
        }

    void saySomething() {
        std::cout << "something" << std::endl;
    }
    
};

#include <emscripten/bind.h>

using namespace emscripten;

EMSCRIPTEN_BINDINGS(jshello) {
    class_<Hello>("Hello")
        .constructor<>()
        .function("saySomething", &Hello::saySomething);
}

使用 Emscripten 构建

使用 Emscripten 构建 C++ 代码,假设您有 运行 您需要的 emsdk_env.sh 运行:

emcc --bind hello_world.cpp -o hello_world.js

注意输出是-o hello_world.js.

示例代码中的模块

现在使用新的 wasm ad js 文件,编写您的 main.js 以加载模块:

// main.js

var Module = require("./hello_world.js");

Module.onRuntimeInitialized = async function(){
    // uncommentthe code below to output the Module in the console
    // console.log('Module loaded: ', Module);
    var instance = new Module.Hello(); // this will print "Hello world!!!""
    console.log(instance); // this will pint the class as an object "Hello{}""
    instance.saySomething(); // this will print "something"
}

我们将代码包装到一个 onRuntimeInitizialized 函数中,这样我们就可以确定我们的代码已经准备好了。

测试代码!

此时可以测试代码:

node main.js

控制台中的输出将是:

node main.js
Hello world!!!

Hello {}
something

示例代码

您可以测试此存储库中的代码https://github.com/kalwalt/Emscripten-sketches/tree/main/hello_world_class

使用 Emscripten 编码愉快!