如何使用emcmake cmake和传递emscripten命令行选项?
相当新的c ++/CMake,但在谷歌上找不到任何有用的东西.所以也许问题只是愚蠢,在这种情况下我道歉.
我可以使用以下CMakeList.txt文件构建我的项目(非webassembly /普通桌面)
cmake_minimum_required(VERSION 3.7)
project(Engine)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PROJECT_SOURCE_DIR}/cmake")
set(CMAKE_INCLUDE_PATH /usr/local/include)
set(SOURCE_FILES main.cpp src/Background.cpp src/Background.h src/Camera.cpp src/Chart.cpp src/Chart.h src/logger.cpp src/Engine.cpp src/Engine.h src/GL.cpp src/GL.h src/Instrument.cpp src/Instrument.h)
set(EMCC_LINKER_FLAGS "-s SAFE_HEAP=1 --bind -s WASM=1 -O3 -o ../index.js -s LEGACY_GL_EMULATION=0 -s GL_UNSAFE_OPTS=0 --pre-js pre-module.js --post-js post-module.js -s ASSERTIONS=1 -s GL_ASSERTIONS=1 -s INVOKE_RUN=0 -std=c++11 -s USE_WEBGL2=1 -s FULL_ES3=1 -s USE_GLFW=3 -s OFFSCREENCANVAS_SUPPORT=1 --preload-file shaders --preload-file extern --use-preload-plugins")
set(CMAKE_REQUIRED_FLAGS "${EMCC_LINKER_FLAGS}")
find_package(OPENGL REQUIRED)
find_package(GLEW REQUIRED)
#find_package(SDL2 REQUIRED)
find_package(glfw3 REQUIRED)
find_package(assimp …Run Code Online (Sandbox Code Playgroud) 我正在尝试一个简单的 hello world WebAssembly 示例,但无法理解在 Chrome 59 中看到的错误:
RangeError:如果缓冲区大小大于 4KB,则主线程上不允许使用 WebAssembly.Compile。使用 WebAssembly.compile,或在工作线程上编译。
src/wasm/counter.wasm:13
10 | let wa;
11 | const make = source => {
12 | // buffer should already be set
> 13 | return wa = new Module(buffer);
14 | };
15 |
16 | const WebAssemblyModule = function(deps = {
Run Code Online (Sandbox Code Playgroud)
我已按照本教程中的步骤进行操作,并且可以毫无错误地构建所有内容。我正在使用create-react-app 重新连线wasm-loader。
如果我使用本地构建的计数器模块,我会收到我在开头提到的错误。如果我尝试使用预构建版本(例如本项目中的版本),它可以正常工作。
当我构建模块时,我使用教程中指定的相同命令。具有工作模块的项目在其自述文件中列出了相同的命令:
emcc counter.c -O1 -o counter.wasm -s WASM=1 -s SIDE_MODULE=1
Run Code Online (Sandbox Code Playgroud)
知道什么可能导致错误吗?
我正在使用YEW框架在Rust中测试一个简单的待办事项应用程序.当我收到错误时,浏览器控制台(Devmode)显示JavaScript或汇编程序(我尝试过Chrome和Firefox).我怎样才能获得Rust代码?我是否必须在某处设置源地图?
我目前正在开发一个个人的Node.js(> = 8.0.0)项目,它要求我调用C子程序(以改善执行时间).我正在尝试使用WebAssembly来执行此操作,因为我需要在浏览器中打开时最终代码兼容.
我使用Emscripten将C代码编译成WebAssembly,并且在此之后不知道如何继续.
任何正确方向的帮助都会很棒.谢谢!
正在阅读有关 Wasm 的 MDN 文档。他们多次使用 WASM 模块这个术语。他们的定义如下:
WebAssembly.Module 对象包含已由浏览器编译的无状态 WebAssembly 代码,可以与 Workers 高效共享,并多次实例化。要实例化模块,请调用 WebAssembly.instantiate() 的辅助重载。
我不太明白这句话的意思。Web 程序集模块只是一个 Wasm 文件还是其他文件?
wasmif和selectwasm之间有什么区别,这些命令的最佳应用是什么?
wat2wasm中的示例:
瓦特代码:
(module
(func (export "Select") (param i32) (result i32)
(select (i32.const 3)
(i32.const 5)
(local.get 0) ))
(func (export "If") (param i32) (result i32)
(if (result i32) (local.get 0)
(then (i32.const 7))
(else (i32.const 11)) )) )
Run Code Online (Sandbox Code Playgroud)
JS代码:
const wasmInstance = new WebAssembly.Instance(wasmModule, {});
const { Select, If } = wasmInstance.exports;
console.log(Select(1)); // => 3
console.log(Select(0)); // => 5
console.log(If(1)); // => 7
console.log(If(0)); // => 11
Run Code Online (Sandbox Code Playgroud)
根据文档:
该select运算符根据第三个操作数是否为零来选择前两个操作数之一。
block、 …
Blazor WebAssembly 代码可以直接从另一个 WASM 模块调用函数吗?还是需要 JavaScript 桥?
OpenCV 是为 WASM 构建的,即 OpenCV.js。有没有办法从 OpenCV WASM 实现中导出函数定义并直接从 Blazor 代码中使用它们?是使用 JS Interop 并拥有调用 OpenCV 函数的 JS 函数的最佳替代方案吗?
我试图在 node.js 中本地实例化一个 .wasm 文件。目标是在本地运行二进制文件并重现网页的功能。这是我的最小可重现示例:
const fetch = require("node-fetch");
const importObject = {
imports: {
imported_func: function(arg) {
console.log(arg);
}
}
};
fetch('https://www.supremenewyork.com/ticket.wasm').then(response =>
response.arrayBuffer()
).then(bytes => {
let mod = new WebAssembly.Module(bytes);
let instance = new WebAssembly.Instance(mod, importObject);
instance.exports.exported_func();
})
Run Code Online (Sandbox Code Playgroud)
我得到的错误是: TypeError: WebAssembly.Instance(): Import #0 module="wasi_unstable" error: module is not an object or function
我看到了一些类似问题的问题,但没有提供真正的解决方案。这是我第一次与 wasm 合作,所以我很迷茫。
谢谢你的帮助。
我试图允许用户在 C 中调用“main”并让“main”等待 requestAnimationFrame 继续执行。即 main 可以有一个 while(1) 循环,而在 main 中,会有一个“waitForAnimationFrame”...或者允许实现像 sleep(...) 这样的函数。
我一直在挖掘 emscripten 如何实际执行此操作的内部工作原理,但它看起来不太适合我的目的。这个页面涉及了许多与我想做的事情非常接近的事情,但是当以这种方式实现时,它们似乎都没有实际工作。https://kripken.github.io/blog/wasm/2019/07/16/asyncify.html
更具体地说,似乎最好的方法是保存堆栈,然后通过 Wasm 中的虚拟函数“返回”,然后当事件在 javascript 中发生时,我可以调用一个虚拟函数但返回到正确的位置。但是,这将需要调用堆栈,它似乎不是实际的一部分STACKTOP,或者通过stackSave和可用stackRestore。最值得注意的是,无论我似乎做什么似乎都setThrew不起作用。即它只是立即返回。
我还尝试使用一些启动/停止展开功能,但由于从 Javascript 返回到 Wasm 时出现错误,因此无法在那里取得进展。
这里有什么想法吗?我真的不能像某些人想要的那样使 main 异步并期望它仍然以相同的方式工作。
编辑:好的,这是我正在测试的一些示例。
示例 1:保存/恢复堆栈
在 C 中有这两个函数:
void waittask()
{
volatile int sentinel = 85755555;
consolelog("waittask1");
waitout();
consolelog("waittask2");
}
void waitret()
{
volatile int sentinel = 12994423;
consolelog("waitret1");
stacksetup(sentinel);
stacksetup(sentinel);
consolelog("waitret2");
}
Run Code Online (Sandbox Code Playgroud)
使用 JavaScript 函数:
stacksetup : function() {
console.log( "STACK SETUP" ); …Run Code Online (Sandbox Code Playgroud) 很长一段时间以来一直在用 Go 编程,最近开始研究 WebAssembly。虽然大多数事情都很简单,但在将一些 Go 特定的结构(如通道和 goroutines)转换为 wasm 时有一个问题。在 JS 中使用时,它们的行为是否与在 Go 中使用时的行为方式相同(例如,goroutines 作为异步函数公开给 JS 等)?
webassembly ×10
emscripten ×3
javascript ×3
node.js ×2
assembly ×1
blazor ×1
browser ×1
c ×1
c# ×1
c++ ×1
cmake ×1
go ×1
if-statement ×1
llvm ×1
low-level ×1
opencv ×1
rust ×1
select ×1
source-maps ×1