我正在尝试一个简单的例子,用JavaScript调用编译为.wasm的C函数.
这是counter.c文件:
#include <emscripten.h>
int counter = 100;
EMSCRIPTEN_KEEPALIVE
int count() {
counter += 1;
return counter;
}
Run Code Online (Sandbox Code Playgroud)
我用它编译了它emcc counter.c -s WASM=1 -o counter.js.
我的main.jsJavaScript文件:
const count = Module.cwrap('count ', 'number');
console.log(count());
Run Code Online (Sandbox Code Playgroud)
我的index.html文件只加载正文中的两个.js文件,没有别的:
<script type="text/javascript" src="counter.js"></script>
<script type="text/javascript" src="main.js"></script>
Run Code Online (Sandbox Code Playgroud)
我得到的错误是:
Uncaught abort("Assertion failed: you need to wait for the runtime to be ready (e.g. wait for main() to be called)") at Error
当我试着打电话count()的时候main.js.我怎么能等待运行时准备好?
我正在编写一个小型C程序,旨在编译为ism w/emcc并在Web浏览器中运行.因为wasm导出的函数只能接受简单的数值作为参数输入和返回值,所以我需要在JavaScript API和编译的WebAssembly代码之间共享内存,以便访问更复杂的数据类型,如字符串或char数组.问题是我不能为我的生活弄清楚如何从我的C程序内部访问WebAssembly线性内存.
我的最终目标是能够在我的C程序中读取在JavaScript中初始化的字符串,然后在Web浏览器的JavaScript代码中读取在我的C程序中修改/初始化的字符串.
这是我正在尝试做的基本示例:
main.js
const importObject = {
'env': {
'memoryBase': 0,
'tableBase': 0,
'memory': new WebAssembly.Memory({initial: 256}),
'table': new WebAssembly.Table({initial: 0, element: 'anyfunc'})
}
}
// using the fetchAndInstantiate util function from
// https://github.com/mdn/webassembly-examples/blob/master/wasm-utils.js
fetchAndInstantiate('example.wasm', importObject).then(instance => {
// call the compiled webassembly main function
instance.exports._main()
console.log(importObject.env.memory)
})
Run Code Online (Sandbox Code Playgroud)
example.c
int main() {
// somehow access importObject.env.memory
// so that I can write a string to it
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这个问题让我成为了那里的一部分,但是,我仍然不明白如何从我的C代码中的WebAssembly内存缓冲区读/写.
我正在尝试正确设置JetBrains CLion 2019.1以从C源代码构建WebAssembly。我几乎尝试了所有方法,但是,没有任何效果。我没有得到任何WebAssembly构建。我得到的是:
WasmText.jsWasmTest.js.memWasmTest.cbp当我em++ main.cpp -o out/index.html -s WASM=1 -O3在命令行上运行时,我实际上得到了
index.htmlindex.jsindex.wasm结果的尺寸也小得多。
我已经使用以下设置设置了构建、执行、部署-> CMake配置:
最小相对
使用默认值:系统
(我曾尝试使用 emscripten sdk 设置我自己的工具链,但是,CLion 对设置执行了一些测试,并抱怨它无法使用em++.
我$EMSCRIPTEN_ROOT$在 CLion 中设置了一个路径变量。我可以确认它可以正常工作,将它传递${EMSCRIPTEN_ROOT}给CMakeLists.txtas 参数。
-DCMAKE_TOOLCHAIN_FILE=${EMSCRIPTEN_ROOT}/cmake/Modules/Platform/Emscripten.cmake
-G"Unix Makefiles"
--debug-output
Run Code Online (Sandbox Code Playgroud)
EMSDK=/wrk/dev/emsdk
EMSCRIPTEN=/wrk/dev/emsdk/emscripten/1.37.12
EMSDK_NODE=/wrk/dev/emsdk/node/4.1.1_64bit/bin/node
LLVM_ROOT=/wrk/dev/emsdk/clang/e1.37.12_64bit
BINARYEN_ROOT=/wrk/dev/emsdk/clang/e1.37.12_64bit/binaryen
EMSCRIPTEN_NATIVE_OPTIMIZER=/wrk/dev/emsdk/clang/e1.37.12_64bit/optimizer
EM_CONFIG=/home/webmaster/.emscripten
PATH=/wrk/dev/emsdk:/wrk/dev/emsdk/clang/e1.37.12_64bit:/wrk/dev/emsdk/node/4.1.1_64bit/bin:/wrk/dev/emsdk/emscripten/1.37.12:/bin:/usr/bin:/usr/lib/bin
Run Code Online (Sandbox Code Playgroud)
-j 2
(字段为空时自动设置)
#include <iostream>
int main()
{
std::cout << …Run Code Online (Sandbox Code Playgroud) 目前大多数编程语言,都可以编译成 WebAssembly(官方或者通过外部包)。
所以我想知道......是否可以反编译Web程序集文件?那么我们可以用一种语言编写的代码可以编译为.wasm,并使用另一种语言反编译它?然后,生成.java,.js,.py,.go和等,从.wasm文件。是否可以?
我是 WebAssembly 的新手,但我已经使用它和 Emscripten 大约一个月了,并且对最小的构建工具包相当熟悉。
在调试方面,我发现我找不到如何充分利用 Chrome 和 Firefox 环境。
在 Firefox 68.0.1 中,我的 Source Map 文件加载,我可以将它们正确映射到我的 C/C++ 源文件。
但是,我无法看到本地堆栈。我可以看到所有的局部变量,但是当我逐步执行我的 wasm 代码时,当 FF 显示它时,它将事物推送到我看不到的堆栈中,并且手动跟踪它是一种痛苦。
相比之下,Chrome 76 给了我堆栈,让我添加 Source Map 来查看我的 C/C++ 引用,但我无法让它给我任何类型的 wasm 代码来逐步完成,要么是我自己的垃圾文件,要么自己的拆解版。
我从节点 http-server 或 emscripten emrun 加载的所有 wasm 在 DevTools 的“Sources”选项卡中向我展示了我的源代码,但在 localhost 下还有一个标记为“top/(无域)”的节点。我试过加载一个简单的模块但没有成功。
我想弄清楚如何在 FireFox 中查看本地堆栈或让 Chrome 向我展示 wasm 反汇编(最好是两者)。Chrome 似乎为 WebAssembly Studio 这样做,我不知道为什么
google-chrome-devtools emscripten firefox-developer-tools webassembly
我得到了一个使用 emscripten 编译的 webassembly 模块。现在我正在尝试使用 expressjs 在网页中提供它。
我已经尝试按照这个要点来通过 webpack 包含 webassembly,包括我发现的一个修改,因为这个要点有点旧。
webpack 看起来像这样:
const path = require('path');
module.exports = {
optimization: {
mangleWasmImports: false
},
entry: './src/index.js',
output: {
path: path.resolve(__dirname, './dist/'),
filename: 'dynamic-graph.bundle.js'
},
target: "web",
module: {
rules: [
// Emscripten JS files define a global. With `exports-loader` we can
// load these files correctly (provided the global’s name is the same
// as the file name).
{
test: /fourd\.js$/,
loader: "exports-loader"
},
// wasm files …Run Code Online (Sandbox Code Playgroud) 是否可以将现有的 C# 代码编译为 WebAssembly (.wasm),以便无需或几乎无需更改代码?
我必须为此使用 Blazor 还是其他可能性?
我想创建一个.wasm文件,该文件仍然具有编译时导出的函数名称。
package main
import (
"fmt"
)
func main() {
fmt.Println("Main")
}
func MyFunc() {
fmt.Println("MyFunc")
}
Run Code Online (Sandbox Code Playgroud)
我正在建设
GOOS=js GOARCH=wasm go build -o main.wasm
Run Code Online (Sandbox Code Playgroud)
它会生成 wasm 文件(Go 本身就以 wasm 为目标,这真是太棒了)。
但是使用wabt并进行对象转储会公开这些函数。
Export[4]:
- func[958] <wasm_export_run> -> "run"
- func[959] <wasm_export_resume> -> "resume"
- func[961] <wasm_export_getsp> -> "getsp"
- memory[0] -> "mem"
Run Code Online (Sandbox Code Playgroud)
我期待看到类似的东西
func[137] <MyFunc> -> "MyFunc"
Run Code Online (Sandbox Code Playgroud)
有谁知道如何在 Go WASM 中导出函数?
在 Rust 中,包含#[no_mangle]并pub extern "C" 保持该功能在 wasm-pack 的输出中可用。我正在寻找与 Go 类似的东西。
我想按照这个 js-sys 示例从 Wasm 模块内部实例化 Wasm 模块。在示例中,add调用的函数传递 i32 参数。
我创建了一个 hello world 函数,它接受一个字符串作为参数并返回一个字符串。但是,调用此函数不起作用,因为它返回未定义。
通常,wasm bindgen 会生成粘合代码,该代码创建上下文并将字符串放入堆栈中。然而,Rust 不会生成这样的代码。
如何hello在 Rust 中加载并执行 Wasm 中的函数?
use wasm_bindgen::prelude::*;
#[wasm_bindgen]
pub fn add(a: i32, b: i32) -> i32 {
a + b
}
#[wasm_bindgen]
pub fn hello(name: String) -> String {
format!("hello {:?}", name).into()
}
Run Code Online (Sandbox Code Playgroud)
use js_sys::{Function, Object, Reflect, WebAssembly};
use wasm_bindgen::prelude::*;
use wasm_bindgen::JsCast;
use wasm_bindgen_futures::{spawn_local, JsFuture};
// lifted from the `console_log` example
#[wasm_bindgen]
extern "C" { …Run Code Online (Sandbox Code Playgroud) 是否有一个 WebAssembly API 允许 WebAssembly 代码在没有 JavaScript 的情况下与浏览器交互?例如,访问网络、DOM 和 OpenGL。特别是对于 OpenGL,我必须首先通过 JavaScript 进行每个函数调用,这很荒谬。与此相关的必然是巨大的性能损失。
如果没有,是否有此类 API 的计划?
webassembly ×10
emscripten ×4
blazor ×1
browser ×1
c# ×1
c++ ×1
clion ×1
cmake ×1
go ×1
javascript ×1
rust ×1
server ×1
wasm-bindgen ×1
webpack ×1