绑定 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 编码愉快!
我正在努力将简单的 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 编码愉快!